for each hItems in aHash
// en realidad deberías investigar que devuelve hItems, el nombre lo puse al hazar aunque no lo uso
cMatricula:=HGetKeyAt( aHash,HB_EnumIndex() )
? aHash[cMatricula]:cMatricula
? aHash[cMatricula]:cMarca
? aHash[cMatricula]:nPrecio
? aHash[cMatricula]:cColor
next
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
He hecho una pequeña prueba con la creación de un array de hasta 1.000 elementos, generando aleatoriamente la key (cMatricula), y efectuando 1.000.000 de accesos.
El resultado es sorprendente:
Con arrays convencionales tarda 266 seg. con arrays HASH tarda 4 seg.
********************************************************************************
#include "FiveWin.ch"
function main()
public aCoches:={},oCoche
public hCoches:={=>} // Crea array/tabla HASH vacia
public nIndice,cMatricula,nSegundos
*---
nSegundos:=seconds()
for nIndice=1 to 1000000 // Un millon de veces
Buscar1(alltrim(str(int(HB_Random(1,1000))))) // Números aleatorios de 1 a 1000
next nIndice
nSegundos:=seconds()-nSegundos
? nSegundos // 266 seg. con arrays/tablas convencionales
aCoches:={}
*---
nSegundos:=seconds()
for nIndice=1 to 1000000 // Un millon de veces
Buscar2(alltrim(str(int(HB_Random(1,1000))))) // Números aleatorios de 1 a 1000
next nIndice
nSegundos:=seconds()-nSegundos
? nSegundos // 4 seg. con arrays/tablas HASH
hCoches:={=>}
*---
return nil
********************************************************************************
function Buscar1(cMatricula) // Con arrays/tablas convencionales
local nIndice:=aScan(aCoches,{|oCoche|oCoche:cMatricula==cMatricula})
if nIndice>0 // Existe
oCoche:=aCoches[nIndice]
oCoche:nAccesos:=oCoche:nAccesos+1
else // No existe
oCoche:=TCoche():New(cMatricula)
cMatricula:=oCoche:cMatricula
aadd(aCoches,oCoche)
endif
*-------------------------------------------------------------------------------
function Buscar2(cMatricula) // Con arrays/tablas HASH
if cMatricula IN hCoches // Existe
hCoches[cMatricula]:nAccesos:=hCoches[cMatricula]:nAccesos+1
else // No existe
hCoches[cMatricula]:=TCoche():New(cMatricula)
cMatricula:=hCoches[cMatricula]:cMatricula
endif
return nil
********************************************************************************
CLASS TCoche
DATA nAccesos AS NUMERIC INIT 0
DATA cMatricula,nPeso,cColor
CLASSDATA lRegistered AS LOGICAL
METHOD New(cMatricula) CONSTRUCTOR
METHOD End()
ENDCLASS
METHOD New(cMatricula) CLASS TCoche
DEFAULT cMatricula:="XX9999"
::nAccesos:=1
::cMatricula:=cMatricula
::nPeso:=1000
::cColor:="rojo"
return Self
METHOD End() CLASS TCoche
::nAccesos:=nil
::cMatricula:=nil
::nPeso:=nil
::cColor:=nil
return .T.
********************************************************************************
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Creo que no son resultados 'comparables'. En la busqueda por array utilizas ascan que hace una busqueda lineal. Una comparacion buena seria que la busqueda se hiciera con algun algoritmo de busqueda con el array previamente ordenado.
En cualquier caso, es verdad, y yo los utilizo, que los hash son espectaculares.
Saludos
Active este tema de nuevo (lo he utilizado muchísimo) , por que me surge la necesidad de BORRAR un ELEMENTO de un HASH, pero he buscado en los foros y no logro encontrar la respuesta.
De antemano gracias al que pueda ayudarme.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
hb_HDel(<hHash>, <Key>) ➜ hHash
Deletes a key and it’s associated value from a hash table.
hb_HDelAt(<hHash>, <nPosition>) ➜ hHash
removes an entry from a hash table, based on its index position.
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.