4 votes

Si la clé dans la table de hachage est un objet de classe, comment fonctionne containsKey ?

Lorsque nous plaçons une classe Objet (qui a disons trois membres de données) dans une table de hachage, comment puis-je empêcher de mettre une autre entrée dans la table de hachage dont la clé a les mêmes trois membres de données ? Car je suppose que ce sera un nouvel objet. Donc hashtable.containsKey() retournera false même s'il y a une clé (cet objet de classe) qui a les mêmes membres de données que celle qui attend d'être insérée.

Plus clairement : J'ai une classe comme

class Triplet {
private Curr curr;
private Prev prev;
private Next next;
}

J'ai une structure de table de hachage comme :

Hashtable<Triplet, Integer> table = new Hashtable<Triplet, Integer>();

Quand je le fais :

if(!table.containsKey(triplet_to_inserted))
table.put(triplet, new Integer(0));

Est-ce que cela va insérer un duplicata même si la table contient un triplet qui a déjà les mêmes membres de données ? C'est-à-dire : triplet_to_be_inserted.curr, triplet_to_be_inserted.next et triplet_to_be_inserted.prev. Si oui, comment éviter cela ?

De même, pour toute entrée à insérer, containsKey() renverra-t-il toujours vrai ? Comment contourner ce problème ?

Merci.

7voto

TryHarder Points 64

Toutes les classes dont les instances sont utilisées comme clés dans une structure de données de type hash. doit mettre correctement en œuvre la equals y hashCode méthodes. Brian Goetz a un grand article sur ce sujet d'il y a quelque temps.

Sans connaître la structure de Curr , Prev y Next et l'exemple exact est difficile, mais en supposant qu'ils ne sont pas nuls et ont un sens hashCode vous pourriez faire quelque chose comme ceci :

public boolean equals(Object obj) {
    if (!(obj instanceof Triplet)) {
        return false;
    } else {
        Triplet that = (Triplet)obj;
        return this.curr.equals(that.curr) &&
            this.next.equals(that.next) &&
            this.prev.equals(that.prev);
    }
}

public int hashCode() {
    int hash = this.curr.hashCode();
    hash = hash * 31 + this.next.hashCode();
    hash = hash * 31 + this.prev.hashCode();
    return hash;
}

6voto

Jarek Potiuk Points 5104

La méthode la plus simple consiste à utiliser les fonctions de génération hashCode() et equals() d'Eclipse. Vous pouvez sélectionner les membres qui doivent être pris en compte pour le calcul du hashCode et des equals. Ainsi, si vous avez des membres transitoires (ce qui n'est pas le cas), vous ne pouvez utiliser que ceux qui sont pertinents.

Et de façon similaire (et récursive) pour Curr, Prev et Next...

5voto

Yochai Timmer Points 19802

Extrait de la documentation java :

Pour réussir à stocker et à récupérer d'une table de hachage, les objets utilisés comme clés doivent implémenter la fonction code de hachage et la méthode est égal à méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X