Clipper On Line • Ver Tópico - Ordenar (SORT) uma Hash Table

Ordenar (SORT) uma Hash Table

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 02 Dez 2017 17:13

Pessoal,

Alguém saberia informar como fazer um sort em uma hash table

Ex.:
   DbUseArea(.T.,"DBFCDX", "CADASTRO", "CADASTRO", .T.)
   nFields  := CADASTRO->( FCount() )
   hRecords := { => }
   DO WHILE ! CADASTRO->( Eof() )
      hRecord := { => }
      FOR nField := 1 TO nFields
         hb_HSet( hRecord, FieldName( nField ), FieldGet( nField ) ) // for each record, hrecord holds a hash of column name: column value
      NEXT
      hb_HSet( hRecords, hb_NtoS( RecNo() ), hRecord ) // like so, a hash of recno: hash of columns/values of this record
      CADASTRO->( DbSkip() )
   ENDDO


Imaginando que eu queira ordenar pelo campo NOME que está na tabela cadastro ou pelo campo CODIGO após popular a hash table ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 02 Dez 2017 19:48

Não é o que eu queria mas já vai ajudar
Usei aSort para ordenar por CODIGO ou NOME
   aOrdemN := { 1, 5, 3, 2, 4 }
   aOrdemC := { "Y", "A", "X", "D", "B" }
   aLines  := Array(5, 2) // 5 elementos com 2 dimensões
   FOR I:=1 TO Len( aLines )
      aLines[i,1] := { "CODIGO" => hb_NtoS(  aOrdemN[I]) }
      aLines[i,2] := { "NOME" => aOrdemC[I] }
   NEXT
   
   aSort( aLines ,,, {|x,y| y[2]["NOME"] > x[2]["NOME"]} )
   
   FOR EACH oElemento IN aLines
      hwg_MsgInfo( oElemento[2]["NOME"] )
   NEXT
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor JoséQuintas » 03 Dez 2017 10:33

Não sei se é isto:

hbmk2 -find sort

Harbour core (installed):
ASort()
hb_HSort()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 03 Dez 2017 10:59

Tentei hb_HSort, mas não funcionou, não encontrei nenhum exemplo para o que eu preciso.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor JoséQuintas » 03 Dez 2017 11:10

A impressão que tenho é que isso é um array de hash, e não um hash
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ordenar (SORT) uma Hash Table

Mensagempor JoséQuintas » 03 Dez 2017 11:14

#define ELE_CODIGO 1
#define ELE_NOME     2

   aOrdemN := { 1, 5, 3, 2, 4 }
   aOrdemC := { "Y", "A", "X", "D", "B" }
   aLines  := Array( 5 )
   FOR I:=1 TO Len( aLines )
     aLines[ nCont ] :=  { hb_NtoS(  aOrdemN[I]), aOrdemC[I] } }
   NEXT
   
   aSort( aLines ,,, {|x,y| y[ ELE_NOME ] > x[ ELE_NOME ] } )
   
   FOR EACH oElemento IN aLines
      hwg_MsgInfo( oElemento[ ELE_NOME ] )
   NEXT
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 03 Dez 2017 12:39

Quintas,

Você resolveu essa parte, no seu exemplo pra funcionar:
aLines[i]    := { "CODIGO" => hb_NtoS(  aOrdemN[I]), "NOME" => aOrdemC[I] } 

E
aSort( aLines ,,, {|x,y| y[ "CODIGO" ] > x[ "CODIGO" ] } )
   
FOR EACH oElemento IN aLines
   ? oElemento["CODIGO"], oElemento["NOME"]
NEXT
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 03 Dez 2017 13:05

Usando aAdd
aAdd( aLines, { "CODIGO" => hb_NtoS(  aOrdemN[I] ), "NOME" => aOrdemC[I]  } )
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 03 Dez 2017 13:14

O legal da hash table é que você só precisa saber o nome do elemento além de ficar mais "entendível" rs
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor JoséQuintas » 03 Dez 2017 15:05

Prefiro do outro jeito:

FOR EACH oElemento IN aLines
   ? oElemento["CODIGO"], oElemento["NOME"]
NEXT


FOR EACH oElemento IN aLines
   ? oElemento[ ELE_CODIGO ], oElemento[ ELE_NOME ]
NEXT


Diferença:
No primeiro é string, não dá pra saber se digitou errado, vai dar erro na execução.
No segundo é #define, se digitar errado, já dá erro na própria compilação.
E o fonte tá bem parecido.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ordenar (SORT) uma Hash Table

Mensagempor JoséQuintas » 03 Dez 2017 15:10

Aproveitando.....
Rolou um aparente bug do Harbour com Hash no grupo Harbour-users.
No reaproveitamento de variável hash, melhor atribuir NIL à variável e não apenas {}.
Pelo menos enquanto isso não for resolvido.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 03 Dez 2017 18:11

Se for criar uma tabela temporária com hash usando os nomes dos campos a partir do dbf não poderá ser por #define, enfim, se tem erro é culpa do programador, kkkk, se vira pra consertar.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 04 Dez 2017 09:24

Seguindo com os testes...

   DbUseArea(.T., "DBFCDX", "CADASTRO", "CADASTRO", .T.)
   nFields    := CADASTRO->( FCount() )
   aRegistros := {}
   DO WHILE ! CADASTRO->( Eof() )
      hRecord := { => }
      FOR nField := 1 TO nFields
         hb_HSet( hRecord, FieldName( nField ), FieldGet( nField ) ) // for each record, hrecord holds a hash of column name: column value
      NEXT
      aAdd( aRegistros, hRecord )
      CADASTRO->( DbSkip() )
   ENDDO
   FOR EACH oElemento IN aRegistros
      ? oElemento["CODIGO"], oElemento["NOME"]
   NEXT
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor asimoes » 23 Out 2018 21:23

Voltando ao assunto:

O DBF tem 2 campos, CODIGO E NOME
aSort funciona, Hb_HSort não.

   hTable := Hb_Hash()
   aRegistros := {}
   DO WHILE ! CADASTRO->( Eof())
      hRecord := {=>}
      FOR nField := 1 TO nFields
         Hb_HSet( hRecord, FieldName( nField ), FieldGet( nField ) ) // for each record, hrecord holds a hash of column name: column value
      NEXT
      aAdd( aRegistros, hRecord )
      CADASTRO->( DbSkip() )
   ENDDO
   
* Ordenando por CODIGO       
   aSort( aRegistros ,,, {|x,y,z| y[ "CODIGO" ] > x[ "CODIGO" ] } )
   FOR EACH oElemento IN aRegistros
      ? oElemento["CODIGO"] + " " + oElemento["NOME"]
   NEXT

   ?

* Ordenando por NOME   
   aSort( aRegistros ,,, {|x,y| y[ "NOME" ] > x[ "NOME" ] } )
   FOR EACH oElemento IN aRegistros
      ? oElemento["CODIGO"] + " " + oElemento["NOME"]
   NEXT

â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Ordenar (SORT) uma Hash Table

Mensagempor JoséQuintas » 23 Out 2018 22:28

É isso que dá não ler meus posts kkkkk
A solução já está nos posts anteriores.
Anexos
hash.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Bing [Bot], Google [Bot] e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro