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

avec Java Discussion :

La methode contains de vector marche mal


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Points : 25
    Points
    25
    Par défaut La methode contains de vector marche mal
    Bonjour, je voudrais savoir si l'object processusMere qui est un object de la collection histoProcessSysteme est contenue dans la collection processusSystemes(Vector<ProcessusSysteme>) cela fonctionne correctement que pendant les 2 premieres iterations alors que les 2 vectors contienne les mêmes données, je pense que sa vient de l'heritage et de la methode equals mais je trouve pas la solution.
    Merci de votre aide.

    histoProcessSysteme
    0:0
    4:0
    1284:856
    1540:856
    5124:4940
    6916:1008
    7176:1008
    2056:1008
    8200:9500

    processusSystemes
    0:0
    4:0
    1284:856
    1540:856
    5124:4940
    6916:1008
    7176:1008
    2056:1008
    8200:9500

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     for (int i = 0; i < histoProcessSysteme.size(); i++) {
                    ProcessusMere processusMere = histoProcessSysteme.get(i).getProcessusMere();
                    if (processusSystemes.contains(processusMere)) {
                        processusSystemes.remove(processusMere);
                    } else {
                       //
                    }
                }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public  class ProcessusSysteme extends ProcessusMere{
        public ProcessusSysteme(Integer pid, Integer ppid) {
            super(pid, ppid);
        }
     
     
        @Override
        public boolean equals(Object obj) {
            return super.equals(obj);
        }
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class ProcessusMere{
        protected Integer pid;
        protected Integer ppid;
     
        public ProcessusMere(Integer pid, Integer ppid) {
            this.pid = pid;
            this.ppid = ppid;
        }
     
        public Integer getPid() {
            return pid;
        }
     
        public void setPid(Integer pid) {
            this.pid = pid;
        }
     
        public Integer getPpid() {
            return ppid;
        }
     
        public void setPpid(Integer ppid) {
            this.ppid = ppid;
        }
     
        @Override
        public boolean equals(Object obj) {
            ProcessusMere processusMere =(ProcessusMere)obj;
            return this.pid==processusMere.getPid();
        }
     
     
    }

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    Quand on surcharge equals, il faut aussi surcharger hashcode.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    En plus, la méthode equals de la classe ProcessusMere ne respecte pas le contrat.

    Donc, pour ProcessusMere:
    1) Il faut respecter le contrat de equals
    2) Surcharger également hashcode.

    https://jmdoudoux.developpez.com/cou...hniques_java-2

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    - je ne vois pas en quoi cette méthode equals() ne respecte pas le contrat.

    - Il est vrai que quand on redéfinit equals(), il faut redéfinir hashCode() aussi pour éviter les ennuis. Mais, ça ne concerne absolument pas l'usage de la classe Vector (ni ses équivalents modernes, ArrayList et similaires)

    Toujours est-il que le problème pourrait bien être lié à la comparaison this.pid==processusMere.getPid(). En effet, ce sont des Integer, donc des objets. En Java les objets se comparent avec equals(), pas avec ==

    == appliqué sur des objets, sert à vérifier si deux variables pointent sur le même objet, ou si une variable pointe vers null. Pas ce que cette méthode equals() cherche à faire, donc. Elle cherche à vérifier si les numéros de processus sont les mêmes. D'ailleurs, ces pid devraient vraiment être des ints au lieu d'Integers.

    Ça ne veut pas forcément dire que l'erreur est là. Il ne faut pas comparer des Integer comme ça, mais ça pourrait marcher par hasard quand même, et l'erreur serait ailleurs. Pour savoir ce qui ne va vraiment pas, il faudrait avoir le programme entier.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mai 2019
    Messages : 22
    Points : 25
    Points
    25
    Par défaut
    c'est bien == qui pose problème merci de votre aide

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hello,

    - je ne vois pas en quoi cette méthode equals() ne respecte pas le contrat.

    - Il est vrai que quand on redéfinit equals(), il faut redéfinir hashCode() aussi pour éviter les ennuis. Mais, ça ne concerne absolument pas l'usage de la classe Vector (ni ses équivalents modernes, ArrayList et similaires)
    Sur le premier point d'abord, pour résumé (mais je recommande mon lien ou le livre de Joshua Bloch Java Efficace)
    Equals compare des objets. Et les objets peuvent être liés à d'autre classes.

    Donc, en résumé, si je suis moi-même, je retourne vrai.
    Si je suis pas de la même classe que moi même, je retourne toujours false.
    Sinon, je regarde plus en détail.

    Une bonne implémentation serait:
    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
    16
     
    @Override
    public boolean equals(Object obj) {
     
            if(this == object){
                   return true;
            }
            if(object == null){
                   return false;
           }
           if (getClass() != obj.getClass()) {
    	      return false;
    	}
            ProcessusMere other =(ProcessusMere)obj;
            return Objects.equals(this.pid,other.pid) && Objects.equals(this.ppid,other.ppid);
        }
    Notez que pour me simplifier la vie (et réduire le nombre de lignes de codes!), j'utilise la classe Objects.
    De plus, je me base sur tous les attributs (dont ppid).

    Pour le second point, j'ai envie de dire: surtout pas.
    C'est encore plus indispensable si on a une Collection, List ou Map (et Vector d'ailleurs implémente List) en jeu.

    La méthode hashcode intervient dans tout ce qui est table de hachage.
    Mal redéfinir hascode et equals peut avoir des conséquences désastreuses (j'ai vu ça avec Hibernate, entre autre).

    Là aussi, il y a des règles strictes à suivre, mais on peut sur les dernières versions de Java réduire le nombres de lignes de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Override
    public int hashCode() {
    	return Objects.hash(pid, ppid);
    }

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ma foi, il semble vrai que equals() exige que n'importe quoi.equals(null) doivent renvoyer false et pas lancer une NullPointerException. Mais à part ça rien ne dit qu'on ne peut pas lancer d'exception quand on appelle equals() sur deux types qui n'ont rien à voir l'un avec l'autre. Certes ça prive de faire des Collection<Object> et de pouvoir y chercher des choses, mais en même temps ce n'est pas de la bonne programmation ça.

    Il n'est absolument pas nécessaire, et souvent faux, de s'assurer que les deux objets sont d'exactement la même classe. Exemple typique : en Java deux List doivent être considérées égales si et seulement si elles sont de même taille et que pour chaque index, les éléments qu'elles y contiennent sont soit tous les deux null, soit equals() sur eux est true. Et cela quelle que soit l'implémentation de List d'un côté ou de l'autre. Vu la situation donnée en exemple, il ne serait pas surprenant qu'on soit dans un cas de figure similaire.
    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. Réponses: 3
    Dernier message: 12/01/2007, 17h27
  2. Mon implentation de l'algorithme A* marche mal
    Par Davidbrcz dans le forum C++
    Réponses: 7
    Dernier message: 11/09/2006, 20h33
  3. Alpha marche mal!
    Par glnewb dans le forum OpenGL
    Réponses: 2
    Dernier message: 10/09/2006, 17h04
  4. Réponses: 26
    Dernier message: 25/11/2005, 16h12
  5. Case insensitive methode contains()
    Par mihaestii dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 12/11/2005, 11h25

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