Iniciandome en el manejo de tablas HASH

Iniciandome en el manejo de tablas HASH

Postby JmGarcia » 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: Select all  Expand view  RUN
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: Select all  Expand view  RUN
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: Select all  Expand view  RUN
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Mon Mar 12, 2012 12:48 pm

JM;
Con xHarbour lo haría así:
Code: Select all  Expand view  RUN
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
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Mon Mar 12, 2012 6: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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Postby Antonio Linares » Mon Mar 12, 2012 9:11 pm

JM,

Asi debería servir:

Code: Select all  Expand view  RUN

if aHash[ "O-2222-BB" ] == nil
   MsgInfo( "no existe" )
else
   MsgInfo( "existe" )
endif
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Tue Mar 13, 2012 2:02 pm

Code: Select all  Expand view  RUN
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Postby sambomb » Tue Mar 13, 2012 2:17 pm

Code: Select all  Expand view  RUN

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
User avatar
sambomb
 
Posts: 388
Joined: Mon Oct 13, 2008 11:26 am
Location: Itaocara - RJ - Brasil

Re: Iniciandome en el manejo de tablas HASH

Postby jcenteno » Tue Mar 13, 2012 2:25 pm

HHasKey( aHash, "O-2222-BB" ) --> lExists
jcenteno
 
Posts: 23
Joined: Thu Dec 10, 2009 6:07 am

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Tue Mar 13, 2012 2:40 pm

Code: Select all  Expand view  RUN
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
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Tue Mar 13, 2012 6: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: Select all  Expand view  RUN
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Tue Mar 13, 2012 8:31 pm

JM;
mas arriba, en el post que te escribí está
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Tue Mar 13, 2012 9: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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Tue Mar 13, 2012 9: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
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Tue Mar 13, 2012 9:40 pm

MarioG wrote:mas arriba, en el post que te escribí está
Perdona pero no "lo veo" :roll:



He de decir que el contenido de cada elemento de la tabla ha de ser un OBJETO de una clase.
MarioG wrote:
Code: Select all  Expand view  RUN
? "No existe"
aHash["M-9999-DF"]:= "M-9999-DF"
Al no existir el elemnto lo daría de alta asi:
Code: Select all  Expand view  RUN
? "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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: Iniciandome en el manejo de tablas HASH

Postby MarioG » Tue Mar 13, 2012 9:51 pm

Code: Select all  Expand view  RUN
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
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Iniciandome en el manejo de tablas HASH

Postby JmGarcia » Tue Mar 13, 2012 10:09 pm

He encontrado una forma de recorrer la tabla:
Code: Select all  Expand view  RUN
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
User avatar
JmGarcia
 
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Lailton, Timm Sodtalbers and 44 guests