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 :

La méthode contains de ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut La méthode contains de ArrayList
    Bonjour,

    J'aimerais savoir si l'argument que l'on donne à la méthode contains d'un ArrayList doit être de même type que l'ArrayList ?

    Autrement dit, si j'ai un ArrayList de type Object et que je veux savoir s'il contient un objet qui a un attribut avec une certaine valeur, alors je donne à la méthode contains un entier, bien que mon ArrayList ne soit pas de type entier ?

    Est-ce que cela est faisable ou non ?

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    La méthode contains appelle la méthode equals pour déterminer l'égalité entre tes deux objets.

    Tout dépend donc de l'implémentation de equals pour le type d'objet contenu dans l'ArrayList.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Si je comprends bien, tu as ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public classe MonObjet {
     
        public int monAttribut1;
        public int monAttribut2;
     
        public MonObjet(int _premierAttribut, int _secondAttribut)  {
            monAttribut1 = _premierAttribut;
            monAttribut2 = _secondAttribut;
        }
     
    }
    et tu voudrais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MonObjet objet1 = new MonObjet(1,1);
    MonObjet objet2 = new MonObjet(2,1);
    List<MonObjet> listeObjet = new ArrayList<MonObjet>();
    listeObjet.add(objet1);
    listeObjet.add(objet2);
     
    // Ce que tu veux faire, c'est ca ?
    if (listeObjet.contains(1)) {
         // Traitement
    }
    Comment le programme peut/doit savoir à quel attribut tu veux te référer ? Dans l'exemple ici, le "1", ce serait pour le premier ou le second attribut ?

    En outre, la méthode contains() doit, dans ton cas, prendre en argument un objet de même type que celui de ta liste (MonObjet ici). Cette méthode retournera alors vrai si et seulement si (cf. javadoc) la liste contient un objet tel qu'il soit égal à l'objet passé en paramètre, au sens de la méthode equals().

    Donc, pour répondre à ton besoin, il faudrait que :
    • Tu passes un objet à la méthode contains() (de même type que celui de la liste) ;
    • Pour ce type d'objet, tu redéfinisse la méthode equals(), afin de dire que deux objets sont égaux si et seulement si ils répondent à tes critères précis ;


    Attention toutefois en redéfinissant la méthode equals() aux mauvaises surprises...

    Mako.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Equals sauf erreur prend un paramètre de type Object non?

    Donc théoriquement il n'a pas forcément besoin que le paramètre soit de même type, tout dépend de la surcharge de equals.

    Même si bien évidemment il est très déconseillé de faire cela...

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par deathness Voir le message
    Equals sauf erreur prend un paramètre de type Object non?
    Oui, tout à fait.

    Citation Envoyé par deathness Voir le message
    Même si bien évidemment il est très déconseillé de faire cela...
    C'est pour ça que j'étais parti directement sur une comparaison entre objets de même type.

    En fait, ce qu'il faudrait faire pour redéfinir la méthode equals() (proprement), c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public boolean equals(Object o) {
        MonObjet objet = (MonObjet) o;
        // On definit quand this et objet sont egaux et on retourne un booleen
    }
    Mako.

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par Mako 5013 Voir le message
    En fait, ce qu'il faudrait faire pour redéfinir la méthode equals() (proprement), c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public boolean equals(Object o) {
        MonObjet objet = (MonObjet) o;
        // On definit quand this et objet sont egaux et on retourne un booleen
    }
    J'ajouterais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public boolean equals(Object o) {
       boolean b = false;
       if(o instanceof MonObjet)
       {
           MonObjet objet = (MonObjet) o;
           // On definit quand this et objet sont egaux et on retourne un booleen
          b = ...;
       }
       return b;
    }
    Ca evitera des exceptions de cast

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    merci beaucoup pour toutes ces réponses.
    en fait oui je voudrais vérifier si mon arraylist qui est de type objet contient un objet avec une certaine valeur qui est de type entier. en se basant sur ce que vous avez dit apparemment il faut définir la methode equals mais j'ai pas bien compris comment je peut faire ça.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par boubounagh Voir le message
    il faut définir la methode equals mais j'ai pas bien compris comment je peut faire ça.
    Tu peux te baser sur le code hwoarang pour commencer. Tu places son code dans la classe de ton objet, et il ne reste plus qu'à dire quand deux objets de cette classe sont égaux (dans ton cas, il semblerait que c'est lorsque "ta certaine valeur" est identique, peut importe le reste). Tu auras donc une condition du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        // Avec les notations des exemples precedents
        b = (this.maCertaineValeur == objet.maCertaineValeur)
    Mako.

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    si c'est possible est ce que vous pouvez m'expliquer le code de hwoarang ?

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    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
     
     
    // On redefinit la methode equals()
    @Override
    public boolean equals(Object o) {
       boolean b = false;
       if(o instanceof MonObjet)
       { 
           // Si on est la, c'est que l'on est sur que o est bien du meme type que celui de this
           // on peut donc regarder s'ils sont egaux (a notre sens)
           MonObjet objet = (MonObjet) o;
           // Si maCertaineValeur est identique pour mes deux objets
           // on considere qu'ils sont egaux, et donc on retourne true
           // (quelque soit la valeur des autres attributs
           b = (this.maCertaineValeur == objet.maCertaineValeur);
       }
       return b;
    }
    Mako.

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    avec ceci je me suis éloigné du pb principal qui est: je voudrais savoir si ma arraylist contient un objet avec une certaine valeur, mais ce que je fais actuellement est de comparer deux objets n'est ce pas?

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    en fait l'instruction suivante qu'elle est son intérêt:
    MonObjet objet = (MonObjet) o;
    on crée un objet de type mon objet pour faire quoi?

  13. #13
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par boubounagh Voir le message
    avec ceci je me suis éloigné du pb principal qui est: je voudrais savoir si ma arraylist contient un objet avec une certaine valeur, mais ce que je fais actuellement est de comparer deux objets n'est ce pas?
    Tu redéfinis une méthode de "comparaison" (en fait, juste d'égalité ou non), qui sera utilisée pour savoir si ta liste contient ou non tel élément.
    cf. la première réponse de deathness :

    La méthode contains appelle la méthode equals pour déterminer l'égalité entre tes deux objets.
    Citation Envoyé par boubounagh Voir le message
    en fait l'instruction suivante qu'elle est son intérêt:
    MonObjet objet = (MonObjet) o;
    on crée un objet de type mon objet pour faire quoi?
    La méthode equals() est une méthode définie pour la classe Object, et qui compare deux Object entre eux. Or, tu veux la redéfinir, tu ne peux donc pas changer sa signature, et ta méthode est donc public boolean equals(Object o) {}. Donc l'argument est de type Object, mais toi, ce que tu veux, c'est pouvoir dire "mon objet, de type MonObjet, est-il oui ou non égal à mon second objet, qui est aussi de type MonObjet". Donc tu ne veux pas travailler avec le type Object, mais le type MonObjet. On écrit alors la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet objet = (MonObjet) o;
    Ainsi, tu peux travailler avec un objet du bon type. Si tu étais resté juste avec o (de type Object), tu n'aurais pas pu utiliser les attributs propre à la classe MonObjet.

    Mako.

  14. #14
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Je penses que tu devrais apprendre les notions de conception objet et héritage pour vraiment comprendre ce que tu dois faire et la solution qui t'a été donné.

  15. #15
    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
    Bon sang, les aminches, elle est pourtant pas compliquée la question :

    Citation Envoyé par boubounagh Voir le message
    Est-ce que cela est faisable ou non ?
    Faisable, en faisant des odieux bricolages qui se paieront très cher plus tard, oui.
    À faire, non.

    Ne cherche pas à le faire. À la place, fais un parcours de la liste et arrête-toi quand tu trouves un objet qui contient ce qui t'intéresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static boolean containsATrucWhichMachinIs(Collection<? extends Truc> collection, int wantedMachin) {
      for(Truc truc : collection) {
        if(truc.getMachin() == wantedMachin) {
          return true;
        }
      }
      return false; // not found
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    merci merci beaucoup le pb est résolu merci une autre fois pour toutes les explications que vous m'avez donné et car vous avez été patient avec moi.

  17. #17
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    en fait j'ai fait comme Mako m'as dit et mon pb est résolu pourquoi tu me dis que tu ne me conseille pas de faire ceci est j'ai pas compris ta solution proposé.

  18. #18
    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 boubounagh Voir le message
    en fait j'ai fait comme Mako m'as dit et mon pb est résolu pourquoi tu me dis que tu ne me conseille pas de faire ceci est j'ai pas compris ta solution proposé.
    La méthode de Mako est très bien, mais ce n'est pas ce que tu avais demandé.

    - La méthode de Mako permet de vérifier si ta liste contient un objet égal à l'objet que tu lui passes. Bref, de vérifier si elle contient un Truc égal à un Truc que tu lui passes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<Truc> trucs = contruireUneListeDeTrucs();
    Truc unTruc = new Truc();
    if(trucs.contains(unTruc)) {
      // il est contenu
    } else {
      // il n'est pas contenu
    }

    - Toi tu as demandé quelque chose permettant de vérifier si ta liste contient un objet dont une des propriétés est égale à un truc que tu lui passes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<Truc> trucs = contruireUneListeDeTrucs();
    int wantedMachin = 1;
    if(containsATrucWhichMachinIs(trucs, wantedMachin)) {
      // il est contenu
    } else {
      // il n'est pas contenu
    }
    Ce sont deux choses différentes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    peut etre il se parait que je demande deux choses qui sont différentes en fait non moi je voudrais vérifier que mon arraylist qui est de type objet contient un objet qui a un attribut avec une certaine valeur qui est dans mon cas un entier.
    et donc Mako m'a proposé de redéfinir la fonction equals pour comparer l'attribut en question de mon objet. et ceci ce que je veux.
    en tout cas merci à toi aussi pour ton intérêt et tes réponses.

  20. #20
    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
    Bon, apparemment tu te comprends, c'est toujours ça de gagné -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ArrayList et méthode contains
    Par Lenou dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/04/2011, 11h43
  2. ArrayList -> méthode contains() (pour algo de Dijsktra)
    Par Jeff_as_jefferson dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/06/2007, 20h09
  3. [C#]Méthode utilisant des arraylist
    Par Cyriusix dans le forum Accès aux données
    Réponses: 6
    Dernier message: 04/05/2007, 09h44
  4. Réponses: 6
    Dernier message: 05/04/2007, 16h34
  5. méthode contains et utilisation
    Par kamos dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 01/11/2006, 21h53

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