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

Langage Java Discussion :

Boucle for Vs While sur un Iterator


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut Boucle for Vs While sur un Iterator
    Bonjour,

    Etant à court d'arguments à présenter à mon équipe, je m'adresse à vous pour m'aider à dresser les points positifs et négatifs sur l'utilisation des boucles sur les iterators.

    En gros, je pars du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<String> amis = ...
    Du coup, je peux parcourir la liste avec un while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Iterator it = amis.iterator();
    while(it.hasNext()) {
      String ami = it.next();
      // doFoo(ami)...
    }
    Ou avec un for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(Iterator it = amis.iterator(); it.hasNext();) {
      String ami = it.next();
      // doFoo(ami)...
    }
    Le while semble mieux coller à la logique (à débattre) mais le for permet de limiter la portée de l'iterator.

    Je précise que, dans certains cas, je suis bien obligé de travailler avec un iterator car la lib qu'on utilise nous renvoie directement un iterator et non une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Iterator it = monService.foo();
    Sinon j'aurais bien entendu fais un for comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(String ami : amis) {
      doFoo(ami)...
    }
    Alors toutes les bonnes remarques sont les bienvenues
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le plus simple reste d'utiliser le for-étendu.

    Et si malheureusement il ne supporte pas directement l'Iterator, on peut se faire une méthode utilitaire pour l'englober dans un Iterable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public static <E> Iterable<E> iterable(final Iterator<E> iterator) {
            return new Iterable<E>() {
                @Override
                public Iterator<E> iterator() {
                    return iterator;
                }
            };
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (String ami : iterable(monService.foo()) {
        // ...
    }
    On peut également imaginer des méthodes similaires avec d'autres types si besoin (Enumeration par exemple)


    a++

  3. #3
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Le dernier for dont tu parles s'appelle un foreach (for-each || for each)
    Il est très pratique pour parcourir la liste sans taper trop de code, mais il devient limité si tu souhaite travailler avec les id etc.
    Donc à privilégier seulement si tu souhaite faire une ou deux instructions (comme dans ton cas) ou travailler uniquement sur l'objet courant de la liste (et non son id)

    Après en ce qui concerne le for et le while lequel choisir ?
    Personnellement pour les itérateurs je choisi toujours le while que je trouve plus "clair" et "lisible" que le for. Mais ça reste un avis personnel.

    Et techniquement il n'y a pas de différences

    edit : grillé
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    En ce qui me concerne, c'est
    - Parcours d'une liste complete simple (pas besoin de connaitre l'index) => for each
    - Parcours d'une liste complete ou j'ai besoin de connaitre l'index => for
    - Parcours d'une liste partielle (par exemple recherche d'un element) => while

    C'est ce qui me semble le plus cohérent par rapport à la philosophie des instructions mais ca ne change pas grand chose en terme de performances et/ou lisibilité...

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    - Parcours d'une liste complete simple (pas besoin de connaitre l'index) => for each
    - Parcours d'une liste complete ou j'ai besoin de connaitre l'index => for
    Heu... Pourquoi une telle distinction ?

    Si tu veux dire par là que tu fais un accès par index au lieu de passer par un Iterator, attention car cela peut se révéler catastrophique selon l'implémentation de la liste (je pense bien sûr aux LinkedLists).




    Perso j'aurais plutôt tendances à utiliser le for-each, sauf si j'ai besoin de supprimer des éléments pendant le parcours, et donc d'utiliser la méthode remove() de l'itérateur...


    a++

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Heu... Pourquoi une telle distinction ?

    Si tu veux dire par là que tu fais un accès par index au lieu de passer par un Iterator, attention car cela peut se révéler catastrophique selon l'implémentation de la liste (je pense bien sûr aux LinkedLists).
    Je n'utilise pas de LinkedList (jamais eu besoin pour le moment, et je n'aime pas l'optimisation créatrice de bugs sans besoin particulier). En fait, je pensais plutot à des cas ou j'ai besoin d'utiliser un indice. Par exemple, transférer un tableau dans un autre.

    Pour prendre un exemple concret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String[] str = {"fich1.txt", "fich2.txt"};
    File[] f = new File[str.lenght];
    for(int i = 0; i < str.lenght; i++)
    {
       f[i] = new File(str[i]);
    }

    Dans le cas du remove, je prefere plutot le while parce que je n'aime pas trafiquer les indices à l'interieur d'un for (plus par philosophie parce que je trouve ca moins lisible qu'autre chose).

    a+

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Je n'utilise pas de LinkedList (jamais eu besoin pour le moment, et je n'aime pas l'optimisation créatrice de bugs sans besoin particulier).
    Justement : l'accès par index est source de problème.
    Un accès par Iterator te garantie le meilleurs compromis quelque soit l'implémentation que tu utilises
    Enfin lorsque tu utilises une List en provenance d'une API tiers, tu ne peux pas garantir son implémentation...

    Citation Envoyé par hwoarang Voir le message
    Par exemple, transférer un tableau dans un autre.
    Là tu manipules un tableau et non pas une Collection... donc pas d'Iterator

    Citation Envoyé par hwoarang Voir le message
    Dans le cas du remove, je prefere plutot le while parce que je n'aime pas trafiquer les indices à l'interieur d'un for (plus par philosophie parce que je trouve ca moins lisible qu'autre chose).
    Avec le remove() de l'Iterator tu ne trafiques pas les indices...


    a++

Discussions similaires

  1. Boucle for ou while
    Par auberstar dans le forum Débuter
    Réponses: 5
    Dernier message: 01/05/2010, 21h22
  2. Boucle For et While
    Par mairou dans le forum Débuter
    Réponses: 6
    Dernier message: 20/09/2008, 21h33
  3. boucle for avec exception dans l iteration
    Par norachaouia dans le forum Langage
    Réponses: 2
    Dernier message: 19/07/2007, 13h45
  4. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 10h55

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