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 :

"equals" entre deux treeSet identiques


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut "equals" entre deux treeSet identiques
    bonjour,


    donc mon applications j'ai deux TreeSet<Property> qui contiennent les même valeurs, la classe Property implémente l'interface Comparable.


    lorsque je compare mes deux treeSet entre eux par la méthode equals(...) j'ai toujours un résultat faux. alors que si je compare un à un les elemenet de mon TreeSet il dont bien égaux entre eux

    en résumé lorque je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TreeSet<Property> set_1 = new TreeSet<Property>();
    TreeSet<Property> set_2 = new TreeSet<Property>();
     
    //ici je rempli mes treeSet avec des Propety identiques
     
    boolean eq = set_1.equals(set_2); //ic eq sera faux alors qu'il devrait etre vrai

    je ne comprend vraiment par pourquoi mes treeSet ne sont pas identiques, alors que ma classe Property redéfinie bien la méthode compareTo et la méthode equals

    si l'un d'entre vous sait d'ou peut venir mon problème, cela m'aiderai beaucoup.

    merci à vous

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Est-ce qu'on peut voir les méthodes equals() et compareTo() ?

  3. #3
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Est-ce qu'on peut voir les méthodes equals() et compareTo() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Override
    	public int compareTo(Property p) {
    		if ( (p.getName().equalsIgnoreCase(this.getName())) &&
    				(p.getValue().equalsIgnoreCase(this.getValue())) &&
    				(p.getEncryptionParameter() == this.getEncryptionParameter()) &&
    				(p.getKey().equalsIgnoreCase(this.getKey())) &&
    				(p.getVistaName().equalsIgnoreCase(this.getVistaName())) &&
    				(p.getWid().equalsIgnoreCase(this.getWid())))
    			return 0;
     
    		return -1;	 
    	}

    et pour la méthode equals :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Override 
    	public boolean equals(Object o){
    		if( ! (o instanceof Property))
    			return false;
     
    		return this.compareTo((Property) o) == 0;
     
    	}

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Ta méthode compareTo est bancale : elle ne renvoie jamais de nombre positif.

    De plus, elle utilise des equals là où elle devrait utiliser des compareTo.

    Voici une manière de procéder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public int compareTo (Property p) {
      int cmp;
      cmp = this.getName().compareTo(p.getName());
      if (cmp != 0) return cmp;
      cmp = this.getValue().compareTo(p.getValue());
      if (cmp != 0) return cmp;
      cmp = this.getEncryptionParameter() - p.getEncryptionParameter();
      if (cmp != 0) return cmp;
      cmp = this.getKey().compareTo(p.getKey());
      if (cmp != 0) return cmp;
      cmp = this.getVistaName().compareTo(p.getVistaName());
      if (cmp != 0) return cmp;
      cmp = this.getWid().compareTo(p.getWid());
      return cmp;
    }

  5. #5
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Ta méthode compareTo est bancale : elle ne renvoie jamais de nombre positif.

    De plus, elle utilise des equals là où elle devrait utiliser des compareTo.

    Voici une manière de procéder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public int compareTo (Property p) {
      int cmp;
      cmp = this.getName().compareTo(p.getName());
      if (cmp != 0) return cmp;
      cmp = this.getValue().compareTo(p.getValue());
      if (cmp != 0) return cmp;
      cmp = this.getEncryptionParameter() - p.getEncryptionParameter();
      if (cmp != 0) return cmp;
      cmp = this.getKey().compareTo(p.getKey());
      if (cmp != 0) return cmp;
      cmp = this.getVistaName().compareTo(p.getVistaName());
      if (cmp != 0) return cmp;
      cmp = this.getWid().compareTo(p.getWid());
      return cmp;
    }
    la solution que tu propose semble résoudre le problème, car dans mon test les deux Set sont maintenant identiques.

    j'avais écrit mon compareTo(..) de la manière précedente car dans mon Set l'ordre ne m'intéressait pas vraiment ce qui m'intéressait c'était de ne pouvoir insérer une Property qu'une seule fois.


    la raison technique qui fait que ta solution semble marcher m'échappe à vrai dire, pourrais tu m'expliquai pourquoi cela permet de fonctionner maintenant ??? est ce parce qu'il n'y avait pas de valeur négative précédemment retournée par ma méthode compareTo(..) ?

    merci

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par kespy13 Voir le message
    est ce parce qu'il n'y avait pas de valeur négative précédemment retournée par ma méthode compareTo(..) ?
    En gros oui. Pour être plus précis, pour tout a et b, tu dois t'assurer que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.compareTo(b) == - b.compareTo(a)
    (Plus exactement que a.compareTo(b) soit de signe inverse de b.compareTo(a), et que si l'un est égal à zéro, l'autre aussi.)

    TreeSet et tout ce qui utilise des Comparable comptent à fond dessus.

    Mathématiquement c'est logique car si ce n'est pas le cas, ça signifie que l'ensemble des objets de ta classe n'a pas de relation d'ordre, et donc pas de convention établie pour en ordonner un sous-ensemble.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Bonjour

    La méthode equals vérifie que le Set en cours contient tous les éléments du Set donné en argument.
    Pourrais-tu donner les codes de remplissage ? N'y a-t-il pas une modification d'un objet Property avant le equals ?
    Sinon, selon ton éditeur, essaie de mettre un point d'arrêt lors de l'exécution du code, et de regarder comment se comporte la méthode equals.

    Bon courage !

  8. #8
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    Citation Envoyé par JohnNC Voir le message
    Bonjour

    La méthode equals vérifie que le Set en cours contient tous les éléments du Set donné en argument.
    Pourrais-tu donner les codes de remplissage ? N'y a-t-il pas une modification d'un objet Property avant le equals ?

    pour le remplissage lors de mes tests je fait une simple boucle for qui instancie un certains nombre de Property que j'insere au fur et à mesure dans chacun des Set


    Citation Envoyé par JohnNC Voir le message
    Sinon, selon ton éditeur, essaie de mettre un point d'arrêt lors de l'exécution du code, et de regarder comment se comporte la méthode equals.

    Bon courage !
    le méthode equals entre deux TreeSet fait appel a la methode containsAll(..), qui elle même fait appel a la méthode contains(...) pour chacun des éléments, qui elle regarde si une clé est associé à l'objet en paramètre dans la Map associé au Set

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

Discussions similaires

  1. copier la même table entre deux bases identiques
    Par nadir3700 dans le forum Requêtes
    Réponses: 0
    Dernier message: 30/12/2009, 17h40
  2. Probleme de comparaison entre deux cellules identiques
    Par GlamIS dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/07/2008, 14h50
  3. Réponses: 1
    Dernier message: 20/06/2007, 17h03

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