Ordenar (SORT) uma Hash Table

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

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

Pessoal,

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

Ex.:

Código: Selecionar todos

   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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

Não é o que eu queria mas já vai ajudar
Usei aSort para ordenar por CODIGO ou NOME

Código: Selecionar todos

   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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordenar (SORT) uma Hash Table

Mensagem por JoséQuintas »

Não sei se é isto:
hbmk2 -find sort

Harbour core (installed):
ASort()
hb_HSort()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordenar (SORT) uma Hash Table

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordenar (SORT) uma Hash Table

Mensagem por JoséQuintas »

Código: Selecionar todos

#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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

Quintas,

Você resolveu essa parte, no seu exemplo pra funcionar:

Código: Selecionar todos

aLines[i]    := { "CODIGO" => hb_NtoS(  aOrdemN[I]), "NOME" => aOrdemC[I] } 
E

Código: Selecionar todos

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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

Usando aAdd

Código: Selecionar todos

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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordenar (SORT) uma Hash Table

Mensagem por JoséQuintas »

Prefiro do outro jeito:

Código: Selecionar todos

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

Código: Selecionar todos

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordenar (SORT) uma Hash Table

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

Seguindo com os testes...

Código: Selecionar todos

   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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Ordenar (SORT) uma Hash Table

Mensagem por asimoes »

Voltando ao assunto:

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

Código: Selecionar todos

   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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordenar (SORT) uma Hash Table

Mensagem por JoséQuintas »

É 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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder