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 :

[HashSet] élément non unique


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut [HashSet] élément non unique
    Hello !

    J'ai un problème avec la classe hashset : j'ai redéfini la methode equals pour une classe que j'utilise, et pourtant si j'insère deux objets différents ayant les mêmes attributs, le deuxième n'est pas rejeté c'est-à-dire que le hashSet ne voit pas qu'il est déjà contenu. Cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set hashSet = new HashSet();
    VirtualFile f1 = new VirtualFile("C:\\test.txt", false);
    VirtualFile f2 = new VirtualFile("C:\\test.txt", false);
    System.out.println("f1 égal f2 ? " + f1.equals(f2));
    hashSet.add(f1);
    System.out.println("f2 dans le hashSet ? " + hashSet.contains(f2));
    donne la sortie suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f1 égal f2 ? true
    f2 dans le hashSet ? false
    Comment cela se fait-il ? Le hashSet ne se base-t-il pas sur la méthode equals de l'objet ? Si jamais, j'ai essayé avec un TreeSet, et là pas de problème ...

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Affiche ta methode equals de ta classe VirtualFile stp?

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Pour l'instant, ton prog dis que f2 n'est pas dans le HashSet (et c'est ce que tu veux, non?).

    Bon, on dirait que t'as oublié dans ton exemple d'ajouter f2 dans ton HashSet, mais si c'est pas le cas, ça marche bien comme tu le souhaites, ou alors j'ai pas compris ton problème...

  4. #4
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public boolean equals(Object element) {
    		if (element instanceof VirtualFile)
    			return ((VirtualFile) element).getPath().equals(this.getPath());
    		else
    			return false;
    	}
    Où la méthode getPath() renvoie un String.

  5. #5
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Citation Envoyé par seiryujay
    Pour l'instant, ton prog dis que f2 n'est pas dans le HashSet (et c'est ce que tu veux, non?).

    Bon, on dirait que t'as oublié dans ton exemple d'ajouter f2 dans ton HashSet, mais si c'est pas le cas, ça marche bien comme tu le souhaites, ou alors j'ai pas compris ton problème...
    Lol... C'est vrai que je m'embrouille un peu. Mais je n'ai rien oublié : comme f1 et f2 sont les mêmes (du point de vue de la méthode equals en tous cas), après que f1 ait été inséré le test est sensé renvoyé vrai pour f2 aussi ...

    Je sais, c'était encore moins clair ....

  6. #6
    Membre chevronné

    Inscrit en
    Juillet 2002
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 116
    Par défaut
    Le probléme vient du fait que tu n'as pas surchargé la méthode hashCode() de ta classe VirtualFile qui permet de faire une comparaison rapide d'indexage avant que l'algo aille plus loin et teste les méthodes equals() qui ont réussi le teste d'indexage ...

    Voici un exemple en prenant pour hypothése que getPath() retourne un String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class VirtualFile {
     
         public int hashCode() {
             return getPath().hashCode();
         }
     
    }

  7. #7
    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,

    Dans le cas de l'utilisation d'un HashSet. Ne faudrait-il pas écrire la méthode int hashCode() ?

    bon courage.

  8. #8
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Parfait ! J'ignorais cet détail de fonctionnement ! C'est bon à savoir ! En tous cas merci à tous pour vos réponses d'une rapidité épatante !

    A+

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

Discussions similaires

  1. bdd : erreur 3265 élément non trouvé dans cette collection
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/07/2006, 09h52
  2. Erreur de "Élément non trouvé dans cette collection"
    Par charleshbo dans le forum Access
    Réponses: 4
    Dernier message: 04/05/2006, 18h42
  3. Réponses: 6
    Dernier message: 13/12/2005, 15h00
  4. Erreur SQL : Table/alias non unique
    Par albert69 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/11/2005, 17h31
  5. Réponses: 2
    Dernier message: 16/08/2005, 09h43

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