andbin
19-12-2005, 15:54
Ciao, sto sviluppando un programma in Java che dovrebbe poi permettermi di elaborare tutta una serie di statistiche sulle estrazioni del Lotto (ho tutto lo storico dal 1939!). Ho già scritto parecchie classi ma sto avendo un problema con le HashMap e non riesco a capire perché. Naturalmente non posto tutto il codice (sarebbe troppo lungo) ma solo un pezzettino che ho rifatto a mo' di test:
import java.lang.*;
import java.util.*;
class Terno
{
private byte[] numeri;
public Terno (byte n1, byte n2, byte n3)
{
numeri = new byte[3];
numeri[0] = n1;
numeri[1] = n2;
numeri[2] = n3;
}
public boolean equals (Terno t)
{
for (int i=0; i<3; i++)
if (numeri[i] != t.numeri[i])
return false;
return true;
}
public int hashCode ()
{
return ((int) numeri[2]) * 8100 + ((int) numeri[1]) * 90 + ((int) numeri[0]);
}
public String toString ()
{
return numeri[0] + ", " + numeri[1] + ", " + numeri[2];
}
}
public class ProvaTerno
{
public static void main (String argv[])
{
HashMap map = new HashMap (704880);
int n = 0;
for (byte i=1; i<=90; i++)
{
for (byte j=1; j<=90; j++)
{
for (byte k=1; k<=90; k++)
{
if (i != j && j != k && i != k)
{
Terno t = new Terno (k, j, i);
map.put (t, "aaa");
n++;
}
}
}
}
System.out.println ("Inseriti: " + n);
System.out.println ("Dimensione map: " + map.size ());
Terno t = new Terno ((byte) 5, (byte) 6, (byte) 7);
System.out.println (t.toString () + (map.containsKey (t) ? " contenuto" : " non contenuto"));
}
}
In pratica ho una semplice classe Terno che contiene 3 numeri. Ridefinisco i metodi equals(), hashCode() e toString().
Nel main creo un HashMap con capacità di 704880 (che sono tutte le possibili combinazioni per un Terno, prendendo i numeri da 1 a 90 senza ripetizioni e ignorando l'ordine) e poi ci metto nell'HashMap tutte le combinazioni una per una. Come valore ho messo "aaa" tanto per provare (io dovrò metterci un altro oggetto).
Alla fine vado a vedere se è contenuto il Terno 5,6,7.
Avviando questo programma ottengo:
Inseriti: 704880
Dimensione map: 704880
5, 6, 7 non contenuto
In pratica non trova il Terno. Ma non lo trova nemmeno se faccio esplicitamente:
map.put (new Terno ((byte) 5, (byte) 6, (byte) 7), "aaa");
ed è questo che è strano!
Cosa può essere?? Forse il metodo hashCode non è giusto??
Uso il JDK 1.4.2_08-b03.
import java.lang.*;
import java.util.*;
class Terno
{
private byte[] numeri;
public Terno (byte n1, byte n2, byte n3)
{
numeri = new byte[3];
numeri[0] = n1;
numeri[1] = n2;
numeri[2] = n3;
}
public boolean equals (Terno t)
{
for (int i=0; i<3; i++)
if (numeri[i] != t.numeri[i])
return false;
return true;
}
public int hashCode ()
{
return ((int) numeri[2]) * 8100 + ((int) numeri[1]) * 90 + ((int) numeri[0]);
}
public String toString ()
{
return numeri[0] + ", " + numeri[1] + ", " + numeri[2];
}
}
public class ProvaTerno
{
public static void main (String argv[])
{
HashMap map = new HashMap (704880);
int n = 0;
for (byte i=1; i<=90; i++)
{
for (byte j=1; j<=90; j++)
{
for (byte k=1; k<=90; k++)
{
if (i != j && j != k && i != k)
{
Terno t = new Terno (k, j, i);
map.put (t, "aaa");
n++;
}
}
}
}
System.out.println ("Inseriti: " + n);
System.out.println ("Dimensione map: " + map.size ());
Terno t = new Terno ((byte) 5, (byte) 6, (byte) 7);
System.out.println (t.toString () + (map.containsKey (t) ? " contenuto" : " non contenuto"));
}
}
In pratica ho una semplice classe Terno che contiene 3 numeri. Ridefinisco i metodi equals(), hashCode() e toString().
Nel main creo un HashMap con capacità di 704880 (che sono tutte le possibili combinazioni per un Terno, prendendo i numeri da 1 a 90 senza ripetizioni e ignorando l'ordine) e poi ci metto nell'HashMap tutte le combinazioni una per una. Come valore ho messo "aaa" tanto per provare (io dovrò metterci un altro oggetto).
Alla fine vado a vedere se è contenuto il Terno 5,6,7.
Avviando questo programma ottengo:
Inseriti: 704880
Dimensione map: 704880
5, 6, 7 non contenuto
In pratica non trova il Terno. Ma non lo trova nemmeno se faccio esplicitamente:
map.put (new Terno ((byte) 5, (byte) 6, (byte) 7), "aaa");
ed è questo che è strano!
Cosa può essere?? Forse il metodo hashCode non è giusto??
Uso il JDK 1.4.2_08-b03.