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 :

Existence d'un objet dans un Vector


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut Existence d'un objet dans un Vector
    Bonjour,

    J'ai un petit soucis de comportement de mon Vector<Employe>
    Avec la classe Employe suivante (très basique):

    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
    public class Employe {
     
        public int numero;
        public String nom;
     
        public Employe(int numero) {
            this(numero, "");
        }
     
        public Employe(int numero, String nom) {
            this.numero = numero;
            this.nom = nom;
        }
     
        // Deux employés sont égaux s'ils ont le même numéro
        public boolean equals(Employe employe) {
            return (employe.numero == this.numero);
        }
    }
    Le soucis, c'est que j'ai dans mon vecteur une dizaine d'employé de numéro distinct, dont l'un est le numéro 7800 à la position 1 par exemple. Lorsque je fais cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Vector<Employe> emp = new Vector<Employe>();
        emp.add( new Employe(4400, "Paul") );
        emp.add( new Employe(7800, "Martin") );
     
       Employe employe = new Employe(7800);
     
        System.out.println( (emp.get(1).equals(employe))? "Oui" : "Non" ); // Ecrit "Oui"
        System.out.println( (emp.contains(employe))? "Oui" : "Non" ); // Ecrit "Non"
    }
    Or si je m'en réfère à la JavaDoc, c'est la méthode equals() de Employé qui devrait être appelée non ?
    Et cela m'empêche de la même manière d'utiliser d'autre méthodes telles que remove().

    Merci !

  2. #2
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    Oui c'est bien la méthode equals de Employe qui est utilisé et qui te donne le résultat souhaité non ? J'ai pas bien compris ou était ton problème ... ^^

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    de memoire il faut aussi implemeter hashCode().

    un truc du genre
    public int hashCode()
    {
    return numero;
    }

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par JoloKossovar Voir le message
    Oui c'est bien la méthode equals de Employe qui est utilisé et qui te donne le résultat souhaité non ? J'ai pas bien compris ou était ton problème ... ^^
    Le soucis c'est que dans mon exemple, le premier test écrit "Oui" ce qui montre bien que le 1er élément (enfin l'indexe 1, soit le second...) de mon vecteur est égal à "employe", et le second écrit "Non" ce qui veut dire que "employe" ne figure pas dans le vecteur.
    Donc si "employe" est à la position 1, et qu'en même temps il n'est pas dans le vecteur, il y a contradiction

    Citation Envoyé par Trencavel Voir le message
    de memoire il faut aussi implemeter hashCode().

    un truc du genre
    public int hashCode()
    {
    return numero;
    }
    Il me semble que cela est nécessaire seulement pour certaines structures qui utilisent le HashCode (comme la HashMap bien évidemment).



    Je suis arrivé à régler le problème en redéfinissant mon equals() en faisant le test avec un type Object plutot qu'Employe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public boolean equals(Object employe) {
            return (((Employe)employe).numero == this.numero);
        }
    Et là ça marche... je ne sais pas pourquoi, ca doit venir de l'implémentation du Vector.
    S'il y a une explication, je suis toujours preneur.

    En attendant...

  5. #5
    Membre expérimenté
    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
    Points : 1 419
    Points
    1 419
    Par défaut
    Tu définis une méthode equals(Employe) dans ta classe Employe. Avec la méthode equals(Object) définie par la classe Object, tu as donc deux méthodes distinctes qui peuvent être appelées. La seconde, puisque pas redéfinie, ne fait de comparaison que sur l'instance (cette instance-ci est-elle exactement la même que cette instance-là ?)

    Or, si on regarde bien, il existe une méthode contains(Object) mais pas de méthode contains(<GenericType>) dans List (et donc Vector). L'appel de contains connaît donc un Object et non un Employe. Java va donc logiquement appeler la méthode equals(Object), puisqu'il ne reconnaîtra pas l'objet comme étant un Employe.

    si tu veux garder la méthode equals(Employe), tu peux l'utiliser comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public boolean equals(Object o) {
      return o != null && o instanceof Employe && equals((Employe)o);
    }
     
    public boolean equals (Employe e) {
      return e == this || e.numero = this.numero;
    }

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    En fait je pensais que la méthode contains(Employe) existait.
    Et donc en n'ayant pas redéfinit equals(Object) c'est celle de la super-classe qui était appelée !

    Merci pour l'explication

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/08/2010, 10h42
  2. suppression d'un pointeur sur un objet dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 9
    Dernier message: 07/08/2008, 14h42
  3. [STL]Suppression d'un objet dans un vector
    Par cssiste dans le forum SL & STL
    Réponses: 10
    Dernier message: 19/07/2007, 14h23
  4. STL - objet dans un vector/deque
    Par ivles dans le forum SL & STL
    Réponses: 11
    Dernier message: 26/02/2007, 11h38
  5. objets dans un vector
    Par anasama dans le forum SL & STL
    Réponses: 2
    Dernier message: 21/04/2006, 10h21

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