FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Iniciandome en el manejo de tablas HASH
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Iniciandome en el manejo de tablas HASH
Posted: Mon Mar 12, 2012 11:59 AM
Pues mi primer contratiempo en el manejo de tablas hash.

No se como detectar si ya existe un elemento en la tabla hash.

Supongo que una vez detectado que no existe añadir uno mas sería tan facil como esto ¿ no ?:
aHash [ cNuevaMatricula ] := Tcoche():New( cNuevaMatricula )

Code (fw): Select all Collapse
function main()
PUBLIC hHash := {=>},cMatricula
aHash[ "M-1234-DF" ] := Tcoche():New( "M-1234-DF" )
aHash[ "V-4321-AF" ] := Tcoche():New( "V-4321-AF" )
aHash[ "B-1111-AA" ] := Tcoche():New( "B-1111-AA" )
aHash[ "O-2222-BB" ] := Tcoche():New( "O-2222-BB" )
aHash[ "L-3333-CC" ] := Tcoche():New( "L-3333-CC" )

msginfo( hScan ( aHash , "O-2222-BB" ) ) // Me da siempre 0

return nil

**************************************************************************

CLASS Tcoche
   DATA cMatricula,cMarca,nPrecio
   CLASSDATA lRegistered AS LOGICAL
   METHOD New ( cIndicativo ) CONSTRUCTOR
   METHOD End()
ENDCLASS

METHOD New ( cMatricula ) CLASS Tcoche
DEFAULT cMatricula:="X-9999-XX"
::cMatricula:=cMatricula
::cMarca:="¿?"
::nPrecio:=0
return Self

METHOD End() CLASS Tcoche
::cMatricula:=""
::cMarca:=""
::nPrecio:=-1
return .T.


Supongo que la inicializacion de la tabla se puede hacer de esta forma:
Code (fw): Select all Collapse
PUBLIC hHash := {=>}
aHash[ "M-1234-DF" ] := Tcoche():New( "M-1234-DF" )
aHash[ "V-4321-AF" ] := Tcoche():New( "V-4321-AF" )
aHash[ "B-1111-AA" ] := Tcoche():New( "B-1111-AA" )
aHash[ "O-2222-BB" ] := Tcoche():New( "O-2222-BB" )
aHash[ "L-3333-CC" ] := Tcoche():New( "L-3333-CC" )


o de esta otra forma:
Code (fw): Select all Collapse
PUBLIC hHash := {"M-1234-DF" => Tcoche():New("M-1234-DF"),;
                 "V-4321-AF" => Tcoche():New( "V-4321-AF" ),;
                 "B-1111-AA" => Tcoche():New( "B-1111-AA" ),;
                 "O-2222-BB" => Tcoche():New( "O-2222-BB" ),;
                 "L-3333-CC" => Tcoche():New( "L-3333-CC" )}
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
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Mon Mar 12, 2012 12:48 PM
JM;
Con xHarbour lo haría así:
Code (fw): Select all Collapse
aHash:= Hash( "M-1234-DF", "M-1234-DF", ;
              "V-4321-AF", "V-4321-AF", ;
              "B-1111-AA", "B-1111-AA", ;
              "O-2222-BB", "O-2222-BB", ;
              "L-3333-CC", "L-3333-CC" )

if "M-9999-DF" IN aHash
   ? "Existe"
else
   ? "No existe"
   aHash["M-9999-DF"]:= "M-9999-DF"
end
HEval( aHash, {|cKey,cVal| wqout({cKey,cVal}) })   // Algo llamativo, el orden NO es el arriba asignado (??)
msginfo( hScan ( aHash , "M-9999-DF" ) ) // me devuelve 4; como veras no lo adiciona a la última posición

Saludos
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Mon Mar 12, 2012 06:28 PM
Gracias MarioG.

Yo lo que quiero es que el contenido de la tabla sean OBJETOS de la clase Tcoche y el indice sea la mátricula.

Eso es lo que buscaba if "M-9999-DF" IN aHash como detectar si existe un elemento en la tabla.

Probare esto.
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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Mon Mar 12, 2012 09:11 PM
JM,

Asi debería servir:

Code (fw): Select all Collapse
if aHash[ "O-2222-BB" ] == nil
   MsgInfo( "no existe" )
else
   MsgInfo( "existe" )
endif
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 02:02 PM
Code (fw): Select all Collapse
if aHash[ "O-2222-BB" ] == nil

Me da este error: Error description: Error BASE/1132 Bound error: array access
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
Posts: 389
Joined: Mon Oct 13, 2008 11:26 AM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 02:17 PM
Code (fw): Select all Collapse
Try
   if aHash[ "O-2222-BB" ] == nil
      MsgInfo( "no existe" )
   else
      MsgInfo( "existe" )
   endif
catch
   MsgInfo("no existe")
end
Email: SamirSSabreu@gmail.com
xHarbour 1.2.3 + Fwhh 20.2
Posts: 23
Joined: Thu Dec 10, 2009 06:07 AM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 02:25 PM

HHasKey( aHash, "O-2222-BB" ) --> lExists

Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 02:40 PM
Code (fw): Select all Collapse
if "M-9999-DF" IN aHash
...

funciona!
disculpen que insista, pero yo me tropece con el problema hace bastante y es lo que me da buen resultado.
Lo que indica jcenteno tambien es otra opcion factible

Saludos
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 06:37 PM
Gracias Sambomb, buena idea. Pero es una salida de un error y puede que tardar mas tieempo de ejecucion que if "O-2222-BB" IN aHash. Tengo que hacerlo en iteraciones de un programa en tiempo real que recibe mas de 300 mensajes TCP/UDP por segundo.

Me queda otra duda, ¿ como recorro la tabla ?

Code (fw): Select all Collapse
for i=1 to len(aHash)
   ? aHash[i] // me da error "array access"
next i
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
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 08:31 PM

JM;
mas arriba, en el post que te escribí está

Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 09:32 PM
Para 10 millones de iteraciones es mas rápida la sentencia "IN" que la función "HHasKey"

Esta tarda 34,84 seg.
jcenteno wrote:HHasKey( aHash, "O-2222-BB" ) --> lExists

Y esta 32,91 segundos.
MarioG wrote:if "M-9999-DF" IN aHash
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
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 09:35 PM
JmGarcia wrote:Para 10 millones de iteraciones es mas rápida la sentencia "IN" que la función "HHasKey"

Esta tarda 34,84 seg.
jcenteno wrote:HHasKey( aHash, "O-2222-BB" ) --> lExists

Y esta 32,91 segundos.
MarioG wrote:if "M-9999-DF" IN aHash


muy buen aporte
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 09:40 PM
MarioG wrote:mas arriba, en el post que te escribí está
Perdona pero no "lo veo" :-)



He de decir que el contenido de cada elemento de la tabla ha de ser un OBJETO de una clase.
MarioG wrote:
Code (fw): Select all Collapse
? "No existe"
aHash["M-9999-DF"]:= "M-9999-DF"
Al no existir el elemnto lo daría de alta asi:
Code (fw): Select all Collapse
? "No existe"
aHash[ "M-1234-DF" ] := Tcoche():New( "M-1234-DF" )
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
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 09:51 PM
Code (fw): Select all Collapse
HEval( aHash, {|cKey,cVal| wqout({cKey,cVal}) })

Supongo que en este caso será: cKey = "M-9999-DF" y cVal = "O" (Object)
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 654
Joined: Mon May 29, 2006 03:14 PM
Re: Iniciandome en el manejo de tablas HASH
Posted: Tue Mar 13, 2012 10:09 PM
He encontrado una forma de recorrer la tabla:
Code (fw): Select all Collapse
for nIndice=1 to len(aHash)
   cMatricula:=HGetKeyAt(aHash,nIndice)
   ? aHash[cMatricula]:cMatricula
   ? aHash[cMatricula]:cMarca
   ? aHash[cMatricula]:nPrecio
   ? aHash[cMatricula]:cColor
next nIndice
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