FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Hash - Orden
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Hash - Orden
Posted: Sun Aug 31, 2014 03:39 AM

Gene;
Asi como puedo ordenar un array, bidimensional, puedo ordenar un Hash por su Valor?

gracias

Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Hash - Orden
Posted: Wed Sep 03, 2014 10:03 AM

Hola Mario :-)

Usa esta funcion:

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

Espero que te funcione.

8)

______________________________________________________________________________

Sevilla - Andalucía
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Hash - Orden
Posted: Wed Sep 03, 2014 12:58 PM
Hola Manu!
gracias por responder
Hice la prueba así:
Code (fw): Select all Collapse
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! :-)
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Hash - Orden
Posted: Wed Sep 03, 2014 01:51 PM
La función que te envié devuelve un vector ordenado solo con los valores :-)
Prueba esto así:
Code (fw): Select all Collapse
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?
:-)
______________________________________________________________________________

Sevilla - Andalucía
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Hash - Orden
Posted: Wed Sep 03, 2014 02:09 PM
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 (fw): Select all Collapse
      :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
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Hash - Orden
Posted: Wed Sep 03, 2014 02:20 PM
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 (fw): Select all Collapse
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] }
______________________________________________________________________________

Sevilla - Andalucía
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Hash - Orden
Posted: Wed Sep 03, 2014 02:35 PM

Entendido;
nuevamente gracias!

Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Hash - Orden
Posted: Mon Dec 07, 2020 12:58 PM
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 (fw): Select all Collapse
#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 (fw): Select all Collapse
┌────────────────────────────────────────────────────────────────────────────┐
?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 <!-- m --><a class="postlink" href="http://www.harbour-project.org/">http://www.harbour-project.org/</a><!-- m -->
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 *
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Hash - Orden
Posted: Mon Dec 07, 2020 01:19 PM
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
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Hash - Orden
Posted: Mon Dec 07, 2020 04:46 PM

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 (fw): Select all Collapse
ASORT( aArti,,, { |x,y| x["i_articu"] < y["i_articu"] } )
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Hash - Orden
Posted: Wed Dec 09, 2020 03:06 AM
Code (fw): Select all Collapse
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



Regards



G. N. Rao.

Hyderabad, India
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Hash - Orden
Posted: Fri Dec 11, 2020 11:53 AM
Mr Nages, buenos días

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

Code (fw): Select all Collapse
#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


Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Hash - Orden
Posted: Fri Dec 11, 2020 03:28 PM
xHarbour always stores the key/value pairs in the order of the key.

Please test this small example:
Code (fw): Select all Collapse
   hHash := hash( "Z", "AA", "A", "ZZ" )
   XBROWSER hHash
Regards



G. N. Rao.

Hyderabad, India

Continue the discussion