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 généralisée


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut Boucle for généralisée
    Bonjour,

    Tous d'abord, désolé si le sujet a déjà été traité mais je ne l'ai pas trouvé.
    Donc la question est la suivante : lors du parcours d'une liste par une boucle généralisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(<type> variable : liste)
    {
         traitement(variable);   
    }
    , est-on assuré que la liste sera parcouru dans l'ordre des indices croissants ? Vaut-il mieux dans ce cas utiliser un parcours habituel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(int i = 0 ; i < liste.size() ; i++)
    {
         <type> variable = liste.get(i);
         traitement(variable);
    }
    Mes différents essais montrent qu'il n'y a pas de différences entre les deux mais je voudrai être sûr de ne pas tomber sur un cas (rarissime sûrement) où cela ne serait pas identique.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Par défaut
    Bonjour,

    Sur des objets Java standards comme ArrayList, LinkedList, etc... tu n'auras pas de problème. Ton code est équivalent.

    Mais dans l'absolu, ça va dépendre de l'implémentation de liste sur lequel tu itères et la façon dont a été codé "l'itérator" qui est utilisé dans le cas du "for généralisé". On pourrait imaginer d'implémenter l'interface "Iterable" en parcourant les éléments dans un ordre différent, par exemple de la fin vers le début...

    Mathieu

  3. #3
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Moi j'écrirais a priori plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <type> variable
    for(int i = 0 ; i < liste.size() ; variable = liste.get(i++))
         variable.traiter(i);
    Mais du coup, autant faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <type> variable
    for(int i = 0 ; i < liste.size() ; liste.get(i).traiter(i++)) ;
    Mais en fait, je pense que comme on commence en général à apprendre les boucles avec un indice croissant, on voit les listes ainsi : numérotées, et avec un ordre qui a de l'importance. Je pense donc aussi qu'il faut se poser la question de l'utilité de l'indice...

    Et par exemple, une liste qu'il faut traiter dans l'ordre de création des éléments et en connaissant leur indice n'est pas très fréquente, si on y pense bien, à chaque fois. Souvent on se rend compte qu'on se complique la vie en voulant penser au n° de l'élément en cours de traitement.

    Si un identifiant unique est nécessaire, il vaut souvent mieux prévoir une clé unique (qui peut être l'indice, dans un premier temps), ça simplifie tout, par rapport à un indice qui va être modifié parfois de manière innattendue.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si la collection que tu utilise implémente List, vu que la boucle généralisée utilise l'iterator et que la doc de List précise que l'iterator dois se faire dans l'ordre, alors oui, tu a cette garantie pour autant que la classe en question (qui implémente List) respecte la spec

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Perso j'ai tendance à utiliser le for-étendu dans la majorité des cas.
    Pourquoi ?
    • Une syntaxe simple et identique quelque soit l'élément qu'on parcourt (Collection, Set, List ou tableau).
    • Une implémentation basé sur l'Iterator, qui permet un algo adapté à la structure de la collection, sans effets indésirables (un parcours par index sur une LinkedList va se dégrader de manière exponentielle avec la taille de la liste).
    • On a rarement besoin d'un index, et lorsqu'on en a besoin il suffit de rajouter un compteur dans la boucle.


    En fait il y a deux principaux cas où je n'utilises pas le for-étendu, pour des choses qu'il ne permet pas de faire :
    • Pour initialiser un tableau Java.
    • Pour supprimer certains éléments de la Collection (via la méthode remove() de l'Iterator).



    a++

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Sur le remove, j'ai toujours trouvé dommage qu'on ne puisse pas le déclarer dans le for étendu juste pour pouvoir faire le remove. Ca force à avoir deux syntaxes très différentes, c'est vraiment dommage.

    La syntaxe pourrait être simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(<type> variable : liste : iterateur) // la partie : iterateur étant optionnelle
    {
         if (condition) iterateur.remove();
         else traitement(variable); 
    }

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Ca force à avoir deux syntaxes très différentes
    En même temps ta proposition forecerais à avoir une troisième syntaxe encore différente, je vois pas trop l'intérêt ^^

    Le for étendu sert à parcourir. Si tu veux modifier ta collection, alors il ne faut pas utiliser le for étendu.

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

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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