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

  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 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 !

  4. #4
    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;
     
    	}

  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 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

  6. #6
    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;
    }

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

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    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

  9. #9
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    310
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 310
    Par défaut
    merci pour toutes ces informations bien utiles.

  10. #10
    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
    Si tu n'as aucun besoin d'avoir ces informations triées, tu devrais peut-être envisager d'utiliser un HashSet plutôt qu'un TreeSet (et donc de redéfinir simplement, mais correctement equals(Object) et hashCode().

  11. #11
    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
    Si tu n'as aucun besoin d'avoir ces informations triées, tu devrais peut-être envisager d'utiliser un HashSet plutôt qu'un TreeSet (et donc de redéfinir simplement, mais correctement equals(Object) et hashCode().
    en fait j'ai besoin que ces informations soient triées, mais disons que ca ne m'intéressai pas de savoir qu'une Property était supérieur ou inférieur à une autre. c'était pour optimiser des calculs sur un gros volume de données

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    J'essaie de comprendre : tu voulais que les informations soient triées dans un ordre cohérent (par exemple, reproductible,) mais ça ne t'intéressait pas de savoir lequel ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    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 thelvin Voir le message
    J'essaie de comprendre : tu voulais que les informations soient triées dans un ordre cohérent (par exemple, reproductible,) mais ça ne t'intéressait pas de savoir lequel ?
    en fait j'ai un gros voum de donnée,
    j'ai une liste d'objet (qu'on nommera GeneralObject) et pour chacun d'eux j'ai un certains nombres de Property et chaque Property a trois sous liste de PopertyBis.

    pour te donner une idée la taille en mémoire d'un GeneralObject est d'environ 40 Mo.

    et donc pour optimiser les traitement de ces objets j'ai décide de passer par une treeSet de Property. car les opérations sur les éléments triés sont beaucoup plus performant.

    mais cela ne m'intéressai pas forcement d'avoir une véritable relation d'ordre entre chaque Property (d'où le return -1 que j'avais mit au début dans mon compareTo(...)

  14. #14
    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
    En gros, tu veux que ce soit trié pour des questions de performances, mais tu ne veux pas spécialement que ce soit trié...

  15. #15
    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
    En gros, tu veux que ce soit trié pour des questions de performances, mais tu ne veux pas spécialement que ce soit trié...
    oui tout a fait, je sais que ca peut paraitre bizarre

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Contradictoire, plus précisément -_-°. Mais bon, si ton problème est résolu, hein, on va pas épiloguer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ 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, 18h40
  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, 15h50
  3. Réponses: 1
    Dernier message: 20/06/2007, 18h03

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