IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Surcharge de l'égalité et HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Octobre 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 5
    Par défaut Surcharge de l'égalité et HashMap
    Comment faire pour surcharger l'opération d'égalité pour comparer deux clés dans un HashMap ?

    Par avance, merci.

    Olivier

  2. #2
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    bonjour,

    il faut surcharger la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public boolean equals(Object o)
    Mais quelquefois, faut passer par un Comparator (pour trier dans un TreeMap par exemple).

  3. #3
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Octobre 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 5
    Par défaut
    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

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Redefinir pas surcharge (tu ne veux pas change les parametres):

    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
    }
    Attention je crois savoir que pour les Hashmaps (ou Hashtables) la fonction hashcode doit etre coherente avec equals ..

    c'est a dire que si cle1 et cle2 sont equals alors elles doivent avoir le meme hashcode..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Octobre 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 5
    Par défaut
    Oui et j'ai même honte d'avoir posé la question...

    Merci.

    Olivier

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par olivierM
    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
    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 faire

    En gros tu redefinis equals et hashcode dans tes cles et le tour est joue ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  8. #8
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut

    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)
    Y'a pas besoin de HashCode !!!

  9. #9
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Citation Envoyé par yann2

    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)
    Y'a pas besoin de HashCode !!!
    La javadoc dit aussi qu'elle se comporte comme une Hastable alors dans ce cas a quoi sert le methode hashcode ??
    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
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  10. #10
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    re,

    Il est vraiment trop fort !!!

    Est-ce que tu crois que ça marche sans (hascCode)??

    A mon avis oui.

  11. #11
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Si tu ne redefinis pas hashcode voila ce qui est fait:
    This is typically implemented by converting the internal address of the object into an integer
    Ce hashcode est valide et respecte le contrat implicite entre hashcode et equals..
    Simplement attention a ne pas faire une methode equals bizarre qui donnerait un resultat du genre:

    a == b true
    a.equals(b) false

    Enfin moi ce que j'en dis ...

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  12. #12
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    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 ?

  13. #13
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    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
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  14. #14
    Membre à l'essai
    Profil pro
    Etudiant
    Inscrit en
    Octobre 2002
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 5
    Par défaut
    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 !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/12/2003, 10h23
  2. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56
  3. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  4. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo