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 :

Méthode contains dans Collection


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut Méthode contains dans Collection
    Bonjour,
    J'ai un problème dans l'utilisation de la méthode "contains" dans une collection.
    D'après la documentation
    boolean contains(Object o)

    Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
    Dans mon exemple, j'ai créé une classe "Objet" avec la méthode equals
    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 class Objet {
    public int t1;
    public int t2;
    public Objet(int t1, int t2)
    {
        this.t1=t1;
        this.t2=t2;
    }
    public boolean equals(Objet o)
    {
        return (this.t1==o.t1)&&(this.t2==o.t2);
    }
     
    }
    Dans mon test
    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
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
     
     
    public class Test {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Set<Objet> listObjets= new HashSet<Objet>();
            Objet o1=new Objet(1,2);
            Objet o2=new Objet(2,1);
            Objet o3=new Objet(5,4);
            Objet o4=new Objet(1,2);
            listObjets.add(o1);
            listObjets.add(o2);
            listObjets.add(o3);
     
            if (listObjets.contains(o4))
            {
                System.out.println("Yes");
            }else
            {
                System.out.println("No");
            }
     
        }
     
    }
    On voit que l'objet o4 est identique par rapport à l'objet o1 d'après la méthode equals que j'ai défini.
    Par contre, quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listObjets.contains(o4)
    Le système retourne faux!
    Pourriez vous m'aider?
    Merci

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout simplement car tu n'as pas redéfini la méthode hashcode sur laquelle se base très probablement la collection que tu utilises.

    Je cite la javadoc de l'interface Collection

    Implementations are free to implement optimizations whereby the equals invocation is avoided, for example, by first comparing the hash codes of the two elements. (The Object.hashCode() specification guarantees that two objects with unequal hash codes cannot be equal.) More generally, implementations of the various Collections Framework interfaces are free to take advantage of the specified behavior of underlying Object methods wherever the implementor deems it appropriate
    Cf la FAQ Java

  3. #3
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    La signature de equals est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public boolean equals(Object obj) ...
    si tu "surcharges" (en définissant une méthode equals(Objet)) ça ne va pas marcher.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut Implémentation du hashCode
    Merci de vos réponses.
    Par contre, ma question initiale est remmenée à l'utilisation de la fonction hashCode.
    J'ai implémenter la fonction hashCode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public int hashCode()
    {
        return t1+t2;
    }
    Mais ça ne marche pas.
    Dans mon cas, qu'est ce que vous me conseillez pour définir la méthode hashCode?
    Merci

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut
    Par contre, si je ne surchage pas la méthode equals, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public boolean equals(Object o)
    {
        if (o instanceof Objet)
        {    
        return (this.t1==((Objet)o).t1);
        }else
        {
            return false;
        }
    }
    Alors ça marche,
    La question est: est ce que c'est la meilleur façon de réaliser ça?

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par hibou107 Voir le message
    La question est: est ce que c'est la meilleur façon de réaliser ça?
    oui
    tu peux même écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public boolean equals(Object o)
    {
       return (o instanceof Objet) &&  (this.t1==((Objet)o).t1);
        // d'ailleurs pourquoi ne pas comparer t2 tant qu'on y est?
    }
    mais ça ne change rien au fond...
    Après il y a des guerres de religion pour savoir si c'est instanceof ou getClass() qu'il faut utiliser ... (moi je suis instanceofien convaincu)
    pour le hashcode un petit XOR entre t1 et t2 serait bien (uniquement si tu utilises t2 dans equals!)

Discussions similaires

  1. [Tkinter] Méthode get() dans une boucle while
    Par Thundie dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/02/2006, 00h06
  2. Réponses: 2
    Dernier message: 05/01/2006, 14h17
  3. [C#][Designer] Méthode executée dans property en DesignMode
    Par backseatgreg dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/01/2006, 11h00
  4. problème avec la méthode getElementById() dans Firefox
    Par matrouba dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 08h55
  5. [Applet] appel de la méthode stop() dans une applet
    Par ciol2.6.12 dans le forum Applets
    Réponses: 4
    Dernier message: 08/09/2005, 13h40

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