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 :

Contains ne fonctionne pas sur un HashSet


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut Contains ne fonctionne pas sur un HashSet
    Bonjour,

    J'ai un léger problème avec un HashSet. Voici un bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Set<Couple> set = new HashSet<Couple>();
    Couple c = new Couple(v1, v2);
    Couple c2 = new Couple(v1, v2);
    set.add(c);
    System.out.println(set.contains(c2)); // false ??
    System.out.println(c2.equals(c)); // true
    C'est un peu bizarre, non ? Certes c et c2 ne représentent pas le même objet mais la doc précise que c'est le critère c2.equals(c) qui est utilisé pour les méthodes contains, remove, etc...

    Bref, je suis un peu dans le flou là. A noter que si je remplace les Set par des List, ça fonctionne normalement.

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vraissemblablement, votre classe Couple ne respecte pas les spécifications dans son implémentation de la méthode equals et hashcode. Tout est précisé dans la javadoc. En l'occurence ici, c1.hashcode()!=c2.hashcode()

  3. #3
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    En effet, ça fonctionne si je redéfinis la méthode hashCode() mais j'ai quand même du mal à comprendre le pourquoi du comment.

    Dans la doc de l'interface Set, je lis :

    Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
    Hors, cette condition est bien vérifiée dans le bout de code que j'ai posté dans le premier message. Je cherche peut-être au mauvais endroit.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    Ok, en faisant des test, je crois comprendre que contains() commence par vérifier que les hashCode sont égaux avant d'utiliser la méthode equals() mais ça ne correspond pas à ce que je lis dans la doc.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ca correspond tout a fait. hashset se base sur equals, et la doc de equals dit que si vous redéfinissez equals, vous devez redéfinir hashcode aussi. Bref, la doc est explicite sur tous les points.

    En l'occurence, comme son nom l'indique, hashet distribue les donnée sur une hashtable en fonction de leur hash. Donc si vous ne redefinissez pas le hash correctement....

  6. #6
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    Avant tout, merci d'avoir pris le temps de me répondre.

    Justement, la doc précise que la méthode contains() se base sur equals() mais ne fait en aucun cas référence à la "subtilité" au sujet du hashCode().

    Cela dit, on va pas non plus polémiquer non plus pendant 107 ans sur la clarté de la doc. J'ai compris d'où venait le problème, je vais mettre ce thread comme étant résolu.

    Et merci encore.

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

Discussions similaires

  1. Contains ne fonctionne pas sur un string !
    Par Ceubex dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2014, 10h53
  2. Réponses: 4
    Dernier message: 03/04/2006, 08h50
  3. Réponses: 7
    Dernier message: 10/02/2006, 18h00
  4. TXMLDocument, ne fonctionne pas sur tous les PC
    Par Neilos dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/10/2005, 22h33
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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