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

Langage Java Discussion :

Problème inexplicable avec une TreeMap (containsKey)


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Par défaut Problème inexplicable avec une TreeMap (containsKey)
    Bonjour, je ne parviens pas à expliquer la situation suivante :

    J'ai une TreeMap dont la clé est un objet de mon domaine (TermGroup) qui implémente les méthodes hashCode, equals et compareTo. Voici sa déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map<TermGroup, Integer> termGroupFreqs = new TreeMap<TermGroup, Integer>();
    J'ajoute plusieurs éléments dans la Map comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    termGroupFreqs.put(termGroup1, 1);
    termGroupFreqs.put(termGroup2, 1);
    termGroupFreqs.put(termGroup3, 1);
    termGroupFreqs.put(termGroup4, 1);
    Ceci me renvoie la valeur true, logique !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    termGroupFreqs.containsKey(termGroup3);
    Lorsque j'ajoute un cinquième élément (quelqu'il soit):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    termGroupFreqs.put(termGroup5, 1);

    Le même code que précédemment me renvoie la valeur false !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    termGroupFreqs.containsKey(termGroup3);
    Je n'y comprends plus rien, aidez-moi avant que je ne devienne fou ;-) Merci

    Fabrice

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Tu as donc ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    termGroupFreqs.put(termGroup1, 1);
    termGroupFreqs.put(termGroup2, 1);
    termGroupFreqs.put(termGroup3, 1);
    termGroupFreqs.put(termGroup4, 1);
     
    if (termGroupFreqs.containsKey(termGroup3)) System.out.println("trouvé avant 5ème insertion"); // s'affiche
     
    termGroupFreqs.put(termGroup5, 1);
     
    if (termGroupFreqs.containsKey(termGroup3)) System.out.println("trouvé après 5ème insertion"); // ne s'affiche pas
    Euh, présenté comme ça, je crois que tu peux devenir fou J'ai regardé la Javadoc, je ne vois pas pourquoi ça me fonctionnerait pas. Bon par contre j'ai pas testé sur mon environnement.

    Edit : il faudrait être bien sur de ta méthode equals(). Peut-on avoir le code exact que tu as pour les méthodes hashCode() et equals() ?
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Par défaut
    Pour le hashCode, j'ai utilisé la classe HashCodeUtil décrite ici : http://www.javapractices.com/topic/TopicAction.do?Id=28

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public int hashCode() {
            int result = HashCodeUtil.SEED;
            result = HashCodeUtil.hash(result, termGroup);
            return result;
    }
    La méthode equals utilise ce hashCode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        @Override
        public boolean equals(Object o) {
            TermGroup tg = (TermGroup) o;
            return this.hashCode() == tg.hashCode();
        }

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par fabrisss Voir le message
    Le même code que précédemment me renvoie la valeur false !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    termGroupFreqs.containsKey(termGroup3);
    Le problème peut venir :

    1. De ce que tu as modifié entre temps termGroup3, ce qui fait qu'il n'est plus du tout à sa place dans l'arbre.

    2. Ton compareTo n'est pas bien implémenté (typiquement, il n'est pas symétrique).

    Edit : dans une TreeMap, seule compareTo est utilisée, le hashCode ne l'est pas du tout.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Déjà ta méthode equals() est incorrect, puisqu'une comparaison du hashCode ne garantie rien.

    Ensuite comme cela a été dit, il faudrait voir le code complet de ta classe ainsi que la méthode compareTo().


    Enfin, n'hésites pas à poster un code minima qui reproduit le bug (le genre de code qu'on puisse copier/coller rapidement pour tester).


    a++

Discussions similaires

  1. [TP] Problème bizarre avec une boucle
    Par Dunk dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 10/12/2006, 14h06
  2. [Màj du problème] drawString avec une font differente.
    Par RadicalBob dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 14/06/2006, 10h30
  3. [VB6]Problème connexion avec une base ACCESS
    Par mcay dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 15/05/2006, 17h47
  4. Réponses: 1
    Dernier message: 19/01/2006, 17h54
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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