Page 1 of 1

Hash - Orden

Posted: Sun Aug 31, 2014 3:39 am
by MarioG
Gene;
Asi como puedo ordenar un array, bidimensional, puedo ordenar un Hash por su Valor?

gracias

Re: Hash - Orden

Posted: Wed Sep 03, 2014 10:03 am
by xmanuel
Hola Mario :-)

Usa esta funcion:

function miOrdenHash( hashArray )
return( ASort( hb_HValues( hashArray ) ) )

Espero que te funcione.

8)

Re: Hash - Orden

Posted: Wed Sep 03, 2014 12:58 pm
by MarioG
Hola Manu!
gracias por responder
Hice la prueba así:

Code: Select all

PROCEDURE Main()
loca hashVar:= Hash( "a", "Zaragosa", ;
                     "b", "Klein"   , ;
                     "c", "Romero"  , ;
                     "d", "Gonzalez", ;
                     "e", "Baranda" )

   HEval( hashVar, {|key,val| wqout({key,val}) })
   ? "Ordena?"
   ASort( hb_HValues( hashVar ) )
   HEval( hashVar, {|key,val| wqout({key,val}) })          // No ordena
   ? "Ordena?"
   hashVar := ASort( hb_HValues( hashVar ) )
   HEval( hashVar, {|key,val| wqout({key,val}) })          // Da error de argumento en el hash
 
que estoy haciendo mal?

P.D: larga vida a TDBF! :wink:

Re: Hash - Orden

Posted: Wed Sep 03, 2014 1:51 pm
by xmanuel
La función que te envié devuelve un vector ordenado solo con los valores ;-)
Prueba esto así:

Code: Select all

local hashVar:= Hash( "a", "Zaragosa", ;
                     "b", "Klein"   , ;
                     "c", "Romero"  , ;
                     "d", "Gonzalez", ;
                     "e", "Baranda" )

local aValues := ASort( hb_HValues( hashVar ) )

   aEval( aValues, {|val| wqout( val ) })          
 
La verdad es que no sé para qué quieres un hash ordenado? o sólo quieres los valores ordenados?

A ver si te puedo ayudar?
:mrgreen:

Re: Hash - Orden

Posted: Wed Sep 03, 2014 2:09 pm
by MarioG
Manu;
claro!, disculpá la torpeza, no se ordena el hash, sino se crea un array ordenado
La idea del orden es por lo siguiente.
Resulta que tengo un xBrowse con nombres de personas, donde se las va seleccionando, esta ordenado por un numero de ID, de manera que la búsqueda es mas agil.
Cada registro marcado, mediante la tecla space, hace lo siguiente:

Code: Select all

      :bKeyDown    := {|nK| if( nK==VK_SPACE,  ( oQry:LoadQuery(), ;
                                                 if( HHasKey( hSelec, oQry:id_player ), ( HDel( hSelec, oQry:id_player ) ), ;
                                                                                        ( HSet( hSelec, oQry:id_player, oQry:ApeyNom ), oBrw:GoDown() ) ), ;
                                                 if( Len(hSelec) >= 1, aO[_BtOk]:Enable(), aO[_BtOk]:Disable() ) ), ) }
 
Demanera que cada registro marcado cambia de color.
Esta técnica de selección la uso porque la aplicación se usará en RED.
Ahora bien, cuando termina la selección, se la vuelca a otro xBrowse... si miras en la fecha de este post, vas a encontrar otro, donde hice otra consulta: "Mostrar un hash en xBrowse"; que no tuvo respuesta.
O sea finalmente, la idea es mostrar este segundo browse ordenado.
Pero como no sé como mostrar un Hash en un xBrowse, tu solución me sirve, para que el Hash me devuelva un array ordenado que es lo que puedo mostrar en ese segundo xBrowse
mareado... leeme despacio jejejeje

Re: Hash - Orden

Posted: Wed Sep 03, 2014 2:20 pm
by xmanuel
Si aún así por algún motivo quieres tener la key también pueder crear un array bidimensional que tambien se puede mostrar sin problema en el browse:

Code: Select all

aKeysValues := { 
                         { k1, v1 },;
                         { k2, v2 },;
                         ...
                       }
 
Recuerda que además de la función hb_HValues( hashVar ) está hb_HKeys( hashVar ), construir un aKeysValues es fácil y que ASort admite un codeblock para ordenar:
ASORT(aKeysValues ,,, { |x, y| x[2] < y[2] }

Re: Hash - Orden

Posted: Wed Sep 03, 2014 2:35 pm
by MarioG
Entendido;
nuevamente gracias!

Re: Hash - Orden

Posted: Mon Dec 07, 2020 12:58 pm
by leandro
Buenos días para todos,

Quisiera saber si ya existe alguna función o si directo desde xbrowse se puede cambiar el orden del hash. Ya que estoy tratando de compilar este ejemplo pero no me funciona.

Code: Select all

#include "FiveWin.Ch"
#include "ord.ch"
#include "xbrowse.ch"

PROCEDURE Main()
loca hashVar:= Hash( "a", "Zaragosa", ;
                     "b", "Klein"   , ;
                     "c", "Romero"  , ;
                     "d", "Gonzalez", ;
                     "e", "Baranda" )

   HEval( hashVar, {|key,val| wqout({key,val}) })
   ? "Ordena?"
   ASort( hb_HValues( hashVar ) )
   HEval( hashVar, {|key,val| wqout({key,val}) })          // No ordena
   ? "Ordena?"
   hashVar := ASort( hb_HValues( hashVar ) )
   HEval( hashVar, {|key,val| wqout({key,val}) })          // Da error de argumento en el hash
 
El error

Code: Select all

┌────────────────────────────────────────────────────────────────────────────┐
?FiveWin for xHarbour 19.09 - Sep. 2019          xHarbour development power │▄
?(c) FiveTech 1993-2019 for Microsoft Windows 9X/NT/200X/ME/XP/Vista/7/8/10 │█
└────────────────────────────────────────────────────────────────────────────┘?
  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀?
Compiling...
xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613)
Copyright 1999-2018, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'leandro3.prg' and generating preprocessed output to 'leandro3.ppo'...
Generating C source output to 'leandro3.c'...
Done.
Lines 20, Functions/Procedures 1, pCodes 69
Embarcadero C++ 7.30 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
leandro3.c:
Turbo Incremental Link 6.80 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Error: Unresolved external '_HB_FUN_HB_HVALUES' referenced from C:\FWH1909\SAMPLES\LEANDRO3.OBJ
Error: Unable to perform link
* Linking errors *
 

Re: Hash - Orden

Posted: Mon Dec 07, 2020 1:19 pm
by MarioG
Buenos dias Leandro
Interesante tema. Nunca lo hice

En la Wiki de Harbour veo que existe: HB_HSort()
https://github.com/zgamero/sandbox/wiki/2.7-Hashes

Salvo q estes usando xHarbour, deberias ver si tiene la función

Re: Hash - Orden

Posted: Mon Dec 07, 2020 4:46 pm
by leandro
Recuerda que además de la función hb_HValues( hashVar ) está hb_HKeys( hashVar ), construir un aKeysValues es fácil y que ASort admite un codeblock para ordenar:
ASORT(aKeysValues ,,, { |x, y| x[2] < y[2] }
Lo pude solucionar utilizando la función aSort()

Code: Select all

ASORT( aArti,,, { |x,y| x["i_articu"] < y["i_articu"] } )
 

Re: Hash - Orden

Posted: Wed Dec 09, 2020 3:06 am
by nageswaragunupudi

Code: Select all

function SortHash()

   local hHash := Hash( "a", "Zaragosa", ;
                     "b", "Klein"   , ;
                     "c", "Romero"  , ;
                     "d", "Gonzalez", ;
                     "e", "Baranda" )
   local aPairs, hSort

   XBROWSER hHash TITLE "ORIGINAL HASH"

   aPairs   := {}
   HEval( hHash, { | k, v, i | AAdd( aPairs, { k, v } ) } )
   ASort( aPairs, nil, nil, { |x,y| x[ 2 ] < y[ 2 ] } )
   hSort    := {=>}
   AEval( aPairs, { |a| HB_HSet( hSort, a[ 1 ], a[ 2 ] ) } )

   XBROWSER hSort TITLE "SORTED HASH"

return nil
 
Image
Image

Re: Hash - Orden

Posted: Fri Dec 11, 2020 11:53 am
by leandro
Mr Nages, buenos días

Intente compilar con las funciones de xharbour, pero parece no funcionar.

Code: Select all


#include "Fivewin.ch"

function main()

   local hHash := Hash( "a", "Zaragosa", ;
                     "b", "Klein"   , ;
                     "c", "Romero"  , ;
                     "d", "Gonzalez", ;
                     "e", "Baranda" )
   local aPairs, hSort

   XBROWSER hHash TITLE "ORIGINAL HASH"

   aPairs   := {}
   HEval( hHash, { | k, v, i | AAdd( aPairs, { k, v } ) } )
   ASort( aPairs, nil, nil, { |x,y| x[ 2 ] < y[ 2 ] } )
   hSort    := {=>}
   AEval( aPairs, { |a| HSet( hSort, a[ 1 ], a[ 2 ] ) } )

   XBROWSER hSort TITLE "SORTED HASH"

return nil
 
Image

Re: Hash - Orden

Posted: Fri Dec 11, 2020 3:28 pm
by nageswaragunupudi
xHarbour always stores the key/value pairs in the order of the key.

Please test this small example:

Code: Select all

   hHash := hash( "Z", "AA", "A", "ZZ" )
   XBROWSER hHash