Partage
  • Partager sur Facebook
  • Partager sur Twitter

filtrer une collection

    13 décembre 2009 à 22:27:54

    Pour filtrer une collection je trouve ce code partout :
    static void filter(Collection c) 
    {
      for (Iterator it = c.iterator() ; it.hasNext(); )
        if (!cond(it.next()))
          it.remove();
    }
    

    mais je ne comprends pas pourquoi on retire (remove) un élément quand son suivant (next) ne remplit pas une condition...
    si cet élément suivant (next) ne remplit pas la condition pourquoi on ne retire pas celui-là ?...
    merci pour toute réponse
    • Partager sur Facebook
    • Partager sur Twitter
      14 décembre 2009 à 0:40:08

      Si je ne me trompe pas la fonction next() sur ton itérateur à pour spécification de passer au suivant et de te retourner l'élément. Donc it.next().remove() supprimerait l'élément encore après. Tu peux le voir comme un i++ dans un while. Si tu réfléchis bien si ça ne le faisait pas la boucle tournerait en rond.
      • Partager sur Facebook
      • Partager sur Twitter
        14 décembre 2009 à 9:37:17

        Tel que tu l'as mis là, ce code est faux. Il se peut que remove soit appelé avant next, tu risques donc de supprimer un élément avant de l'avoir vu. Avant d'avoir appelé next, on ne peut pas être certain que le « curseur » soit bien placé. Et puis on risque aussi de faire plusieurs remove de suite et ça, je ne suis pas sûr que ce soit toujours possible non plus.

        Le next n'était pas plutôt compris dans la condition, comme par exemple ceci ?
        if (it.next().equals(...)) it.remove()
        car dans ce cas ce serait correct.

        En tout cas il me semble que les bonnes pratiques de java conseillent d'avoir toujours la séquence hasNext -> next -> remove, et qu'ils déconseillent d'appeler remove sans un next au préalable ou plusieurs fois remove de suite.
        • Partager sur Facebook
        • Partager sur Twitter
          15 décembre 2009 à 21:58:52

          Bin ca respecte parfaitement hasNext -> next -> remove, next() est bel et bien exécuté avant de faire remove()

          Ensuite pour répondre à moimem, tu n'as pas compris ce qu'est un iterateur. Il s'agit en quelque sorte d'un pointeur sur l'élément courant. Donc chaque fois que tu fais next, ce pointeur (appelé parfois cursor) de déplace d'un cran en avant. Donc quand on fait remove, c'est bien l'élément testé par le if qui est retiré, car l'appelle à next a déplacé le pointeur. De plus non seulement next() déplace le pointeur mais en plus il retourne le nouvel élément pointé.

          Par exemple : (on décide d'enlever les nombres négatifs)
          En rouge l'élément sur lequel se trouve le cursor
          au départ (aucun élément sélectionné):

          1 -2 3

          après le première appel à next():

          1 -2 3

          après le second appel à next():

          1 -2 3

          Cette fois on appel it.remove(); qui va enlever l'élément courant donc -2.

          après le troisième et dernier appel à next ():

          1 3

          A noter encore que l'opération remove n'est garanti d'être supporté par toutes les collections, ca peut donc jeter une exception si ca ne gère pas le remove.
          • Partager sur Facebook
          • Partager sur Twitter
            15 décembre 2009 à 22:28:14

            Citation

            Bin ca respecte parfaitement hasNext -> next -> remove, next() est bel et bien exécuté avant de faire remove()


            Non, pas forcément. Si cond est faux, le if n'est pas exécuté => on zappe le next. Maintenant je ne sais pas ce qu'il y a réellement à la place de cond, peut-être que ça joue en fait.
            • Partager sur Facebook
            • Partager sur Twitter
              15 décembre 2009 à 22:42:48

              Oui mais le next n'est pas dans le if mais dans la condition du if donc il est forcement exécuté pour pouvoir savoir si la condition est vraie. Tout ce qui est mis dans la condition c'est a dire entre les () est forcement executé (sauf avec les && ou les || à cause de l'évaluation minimale, seul ce qui est utile est évalué) pour savoir si c'est vrai ou non, et ensuite en fonction du résultat le contenu de if est exécuté ou non.

              En fait ici "cond" est une méthode qui prend en argument l'objet retourné par next() et retourne true ou false suivant les besoin, on peut évidement le remplacer directement parce ce que l'on veut, genre pour filtrer les nombres négatifs

              if(it.next()<0)
              ....
              • Partager sur Facebook
              • Partager sur Twitter
                16 décembre 2009 à 5:56:39

                Ah oui mince, j'avais mal lu le code. La fatigue. Du coup j'ai rien dit. J'avais lu if (cond) it.next(); Donc on est bien d'accord sur la même chose en fait.
                • Partager sur Facebook
                • Partager sur Twitter

                filtrer une collection

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown