Comment faire pour surcharger l'opération d'égalité pour comparer deux clés dans un HashMap ?
Par avance, merci.
Olivier
Comment faire pour surcharger l'opération d'égalité pour comparer deux clés dans un HashMap ?
Par avance, merci.
Olivier
bonjour,
il faut surcharger la méthode
Mais quelquefois, faut passer par un Comparator (pour trier dans un TreeMap par exemple).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 public boolean equals(Object o)
Merci pour la réponse;
J'ai créé une classe Dico extends hashMap dans laquelle j'ai redéfini l'opérateur equals.
Seulement, si je mets un point d'arrêt dessus, je ne rentre jamais dans la fonction, ce qui pour moi signifie que cette méthode n'est pas appelée.
Olivier
Redefinir pas surcharge (tu ne veux pas change les parametres):
Attention je crois savoir que pour les Hashmaps (ou Hashtables) la fonction hashcode doit etre coherente avec equals ..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 // equals pour un objet de type Bidule public boolean equals(Object other) { if (! (other instanceof Bidule)) { return false; } Bidule tmp = (Bidule) other; // la tu compare tes bidules et retourne la bonne valeur }
c'est a dire que si cle1 et cle2 sont equals alors elles doivent avoir le meme hashcode..
Bulbo![]()
re,
Normal,
Si tes clés sont des String, c'est la méthode equals de String qui sera appelée !!
Si tes clés sont des instances de MaClasse, tu dois définir la méthode equals dans MaCLasse. Par défaut, deux objets sont égaux si ils correspondent à la même référence (méthode equals de la classe Object).
j'espère que tu m'as compris.
Oui et j'ai même honte d'avoir posé la question...
Merci.
Olivier
Il faut redefinir cette methode dans la classe utilisee en tant que cle, pas dans la HashMap, la methode equals de la HashMap sert juste a comparer deux HashMap et ce n'est pas ce que tu veux faireEnvoyé par olivierM
![]()
En gros tu redefinis equals et hashcode dans tes cles et le tour est joue ..
Bulbo![]()
Y'a pas besoin de HashCode !!!
public Object get(Object key)Returns the value to which this map maps the specified key. Returns null if the map contains no mapping for this key. A return value of null does not necessarily indicate that the map contains no mapping for the key; it's also possible that the map explicitly maps the key to null. The containsKey operation may be used to distinguish these two cases.
More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.)
Parameters:
key - key whose associated value is to be returned.
Returns:
the value to which this map maps the specified key, or null if the map contains no mapping for this key.
Throws:
ClassCastException - if the key is of an inappropriate type for this map (optional).
NullPointerException - key is null and this map does not not permit null keys (optional).
See Also:
containsKey(Object)
La javadoc dit aussi qu'elle se comporte comme une Hastable alors dans ce cas a quoi sert le methode hashcode ??Envoyé par yann2
Et a quoi sert le "see also Object.hashcode" dans la javadoc ??
Le hashcode est utilise pour accelerer l'acces aux valeurs, le equals etant utilise pour resoudre les synonymes: les cles differentes generant le meme hashcode ..
C'est le principe meme des tables de hashages .. et HashMap ne devrait pas s'appeler comme ca si il fonctionne differemment..
Bulbo![]()
re,
Il est vraiment trop fort !!!
Est-ce que tu crois que ça marche sans (hascCode)??
A mon avis oui.
Si tu ne redefinis pas hashcode voila ce qui est fait:
Ce hashcode est valide et respecte le contrat implicite entre hashcode et equals..This is typically implemented by converting the internal address of the object into an integer
Simplement attention a ne pas faire une methode equals bizarre qui donnerait un resultat du genre:
a == btrue
a.equals(b)false
Enfin moi ce que j'en dis ...
Bulbo![]()
O.K.
J'ai compris. en gros si tu ne redéfinie pas Hashcode, il faut que deux références au même objet soit égales par le méthode equals. c'est ça ?
Sinon, olivier, depuis le temps, tu aurais pu mettre le Résolu non ?
C'est ca et c'est en general le cas a moins de vraiment faire n'importe quoi dans la methode equals ..
Je precisais le point concernant le hashcode car ignorant si cet methode avait ete redefinie, je preferrais prevenir que guerir ..
Et pis ca fait toujours un peu de culture generale![]()
Sans compter qu'un bon hashcode peut augmenter les performances de la HashMap, c'est toujours bon a savoir ..
Bulbo![]()
Après quelques rechereche, il est nécessaire de redéfinir la fonction equals ET la fonction hashCode pour que ces deux fonctions donnent des résultats cohérents.
Merci pour vos conseils et sur la rapidité de réponse !!!
Partager