Si la clé dans la table de hachage est un objet de classe, comment ne containsKey travail?
Quand on met un Objet de classe (qui a dis trois membres de données) dans une table de hachage, comment puis-je éviter de mettre une autre entrée dans la table de hachage dont les clés a les trois mêmes membres de données ? Cos je devine que ce sera un nouvel objet. Si la table de hachage.containsKey() retournera false, même quand il y a une clé (cet objet de classe) qui a les mêmes membres de données, comme celle qui est en attente d'être inséré.
Plus clairement:
J'ai une classe comme
class Triplet {
private Curr curr;
private Prev prev;
private Next next;
}
J'ai une table de hachage de la structure comme:
Hashtable<Triplet, Integer> table = new Hashtable<Triplet, Integer>();
Quand je fais:
if(!table.containsKey(triplet_to_inserted))
table.put(triplet, new Integer(0));
sera cette insérer un doublon, même si la table contient un triplet qui a déjà les mêmes données membres ? Qui est: triplet_to_be_inserted.curr, triplet_to_be_inserted.prochaine et triplet_to_be_inserted.prev
Si oui, comment faire pour éviter cela ?
Aussi, pour toute inscription à être insérée, containsKey() retourne jamais vrai à tous ?
Comment contourner ce problème ?
Grâce.
equals
et hashCode
?OriginalL'auteur zengal | 2011-06-26
Vous devez vous connecter pour publier un commentaire.
Toutes les classes qui ont instances utilisées comme clés dans une table de hachage, comme structure de données doit mettre correctement en œuvre l'
equals
ethashCode
méthodes. Brian Goetz a un excellent article sur ce partir d'un certain temps.Sans connaître la structure de
Curr
,Prev
etNext
et exemple précis est difficile, mais en supposant qu'ils ne sont pas nuls et ont senséehashCode
implémentations, vous pourriez faire quelque chose comme ceci:that.curr
est une erreur de compilation, carthat
est de typeObject
. Vous devez explicitement abattu en premier.Bon spot @FredOverflow. J'ai été regarder cela en sachant que quelque chose n'allait pas!
OriginalL'auteur Rob Harrop
Le plus simple est d'utiliser Eclipse de générer hashCode() et equals(). Vous pouvez sélectionner les membres doivent être prises en compte pour le hashCode et equals de calcul, de sorte que dans le cas où vous avez quelques transitoire membres de (ne pas) vous ne pouvez utiliser que ceux qui sont pertinents.
Et semblable (et récursivement) pour Curr, Prev et Next...
OriginalL'auteur Jarek Potiuk
De documentation de java:
OriginalL'auteur Yochai Timmer