Hashtable avec int tableau en tant que clé en java
Je suis en train de faire une table de hachage en java, où les clés sont de type int[], mais il ne marche pas de travail. J'ai fait un petit programme de test pour montrer mon problème:
public class test{
public static void main(String[] args){
int[] test0 = {1,1};
int[] test1 = {1,1};
Hashtable<int[], String> ht = new Hashtable<int[], String>();
String s0 = "foo";
ht.put(test0, s0);
System.out.println("the result from ht.get(test1)");
System.out.println(ht.get(test1));
System.out.println("the result from ht.get(test0)");
System.out.println(ht.get(test0));
}
}
Mon intention est que les deux ht.obtenir des calles doit renvoyer le même résultat, puisque les deux ensembles sont égaux, mais ils ne. Voici le résultat de l'exécution du code:
the result from ht.get(test1)
null
the result from ht.get(test0)
foo
Suis-je manqué quelque chose ou est-ce tout simplement impossible d'utiliser int[] comme clés dans un hastable?
OriginalL'auteur Niels Hansen | 2011-01-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser int[] comme la clé, mais il doit être le même tableau, non seulement ont le même contenu. (Ce qui signifie qu'il ne fera pas ce que vous voulez)
Tableaux ne sont pas égaux() ou qui ont le même hashCode() en fonction de leur contenu si elles sont dans le même tableau.
La seule façon vous pouvez faire est d'utiliser une Liste<Integer> comme une clé ou un wrapper pour votre int[] par exemple TIntArrayList.
essayez les solutions suivantes.
BTW: table de hachage est un héritage de la classe à mon humble avis, ne pas l'utiliser à moins que vous avez à.
List.equals
etList.hashCode
sont nécessaires à l'utilisation de l'élément de sage de l'égalité.bon point. Supprimé la mention de la mutabilité.
merci pour la réponse, c'est bien que je n'ai pas de repenser l'ensemble de ma conception:-)
OriginalL'auteur Peter Lawrey
Vous pouvez créer des chaînes de tableaux avant le hachage (à moins que la longueur du tableau est trop long) en plus de l'emballage dans une Liste
Si vous choisissez ce dernier, il est une méthode statique de
Arrays
décrit ici À partir de java les Tableaux statiques de la classe à http://download.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#toString(int%5B%5D)Maintenant, vous pouvez hachage de cette, et des tableaux équivalents va de hachage pour la même chose. Vous ne serez pas en mesure de recréer le tableau à partir de la clé, cependant (à moins que Java a une sorte de
eval
maintenant?).
.
.
.
Pour curiousities souci, ici, c'est moi bêtement rouler mes propres jusqu'à ce que j'ai trouvé la méthode ci-dessus:
Si il y a une sorte de statique toString qui fait cela je m'en excuse.
PS - Java ont fonction de réduction (et lambda), les boucles foreach, ou eval (pour la reconstruction de clés dans un tableau si nécessaire)? Ils serait de rendre cette solution plus agréable...
Arrays.toString
méthode statique. Excuses acceptées, le capitaine jon_darkstar.ah vous me battre pour un peu =P
tournant les tableaux dans les chaînes a aussi la solution que j'avais pensé de mon auto, mais je n'aime pas la pensée de l'unnessesary surcharge de la création les cordes à chaque fois que j'ai eu accès à quelque chose dans la table de hachage
bien de créer quelque chose comme une liste de tableaux ferait la même chose, mais vous pourriez tout aussi bien les utiliser partout, au lieu des tableaux de primitives. Bien sûr, vous pouvez rassembler le
HashTable
de vente et d'entrer dans de nouvelles méthodes qui créer des chaînes ou ArrayList à la voléeOriginalL'auteur jon_darkstar
Cause racine est la matrice de test0 et test1 ont différents hashCodes. Si 2 clés différentes hashcodes, ils ne pourront jamais être identiques.
OriginalL'auteur 卢声远 Shengyuan Lu