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

avec Java Discussion :

Pourquoi utiliser un iterator avec un ArrayList ?


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 14
    Points : 19
    Points
    19
    Par défaut Pourquoi utiliser un iterator avec un ArrayList ?
    Bonjour,

    J'ai un projet à rendre dans lequel je dois gérer un reseau de bus. Nous devons utiliser les patterns vus en cours et d'autres supplémentaires sont proposés à l'usage dans le sujet.
    L'un de ces patterns supplémentaires est "Itérator". J'en suis arrivé à la conclusion (assez évidente) qu'il fallait l'utiliser sur la liste des arrêts de bus qui correspondent à une ligne de bus.

    Cependant après avoir lu quelques explications sur internet, je n'en vois pas l'intérêt. Il permet uniquement de parcourir les éléments un par un dans l'ordre jusqu'au dernier.
    Sauf que je peux déjà le faire avec un foreach ou même un for.

    En plus de cela, lorsque j'arrive au dernier élement (donc le dernier arrêt), je suis censé faire "demi-tour" mais ce n'est pas possible avec l'itérator.

    J'ai mal compris quelque chose ou c'est juste que ce n'est pas adapté a mon besoin ?

    Merci

  2. #2
    Membre éclairé

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 452
    Points : 882
    Points
    882
    Billets dans le blog
    5
    Par défaut
    Iterator est effectivement un design pattern.

    Par ailleurs, lorsque l'on fait un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    List<Personne> personnes = .....
     
    for(Personne personne : personnes){
    ....
     
    }
    C'est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    List<Personne> personnes = .....
    Iterator<Personne> it = personnes.iterator();
     
    Personne personne;
     
    while(it.hasNext()){
     
    personne = it.next();
     
    ...
     
    }
    Le for each utilise en réalité l'itérator.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2014
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Merci pour l'explication

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    En gros, oui, c'est pas trop adapté au besoin.

    Iterator peut servir :

    - quand tes données pourraient être dans autre chose qu'un ArrayList. Note, si ça se trouve elles seront quand même dans un ArrayList au bout du compte, ou la plupart du temps. Mais elles pourraient être dans autre chose. Ton programme pourrait être libre de choisir dans quoi il stocke les données. Dans ce cas, il faut un Iterator, parce qu'une boucle de get(i) ne convient pas. (Comme déjà dit, un foreach utilise en fait un Iterator en interne.)

    - si tu veux effacer des données au fur et à mesure que tu les lis. Si tu fais list.remove(i) sur un foreach, ça ne marchera pas, parce que tu changes les données que tu es en train de parcourir, et le foreach ne peut pas deviner comment il doit gérer ça. Avec iterator.remove() les choses sont claires. Note que tu peux faire list.remove(i) à l'intérieur d'un for(int i = 0; i < list.size(); i++) mais qu'il y a un risque non négligeable de te tromper en programmant ça.

    A noter également que certes, on ne peut pas revenir en arrière avec Iterator, qui s'applique sur n'importe quel conteneur énumérable. Par contre on peut tout-à-fait repartir en arrière quand on veut, avec un ListIterator, qui ne s'applique qu'aux listes, et qui étend Iterator.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    A noter qu'un Iterator en Java permet de faire plus que ce qu'on fait avec "foreach", puisqu'il dispose d'une méthode remove qui permet de supprimer un élément pendant l'itération, ce qui en général n'est pas possible avec un parcourt d'un autre type (on obtient une exception de "modification concurrente au parcourt" (ConcurrentModificationException).

    Ainsi on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(Iterator iter = list.iterator(); iter.hasNext(); ) {
     
       if( conditionPourSuppressionVraie(iter.next()) ) {
          iter.remove();
       }
     
    }
    On peut également faire un ListIterator qui permet d'itérer dans les deux directions. Mais itérer dans les deux directions ne veut pas seulement dire faire un itérateur capable d'avancer et de reculer. Dans le cadre d'une ligne de bus, ça n'a même pas d'intérêt. Il est plutôt extrêmement rare qu'un bus fasse demi tour à un arrêt pour retourner au précédent : le cas normal, c'est que le bus parcourt, depuis une station de départ, les stations jusqu'à un terminus puis parcourt les stations dans le sens contraire jusqu'à un terminus qui est la station de départ (voire dans certains cas, certaines des stations du parcourt dans un sens ne sont pas dans le parcourt de retour, et inversement).

    En gros, un itérator sur la liste [1,2,3] dans 1 puis 2 puis 3 et l'itérateur dans le cadre de ton exercice serait un itérateur qui donnerait 1 puis 2 puis 3 puis 2 puis 1... ce qui dans le cadre d'un for each (sur un Iterable et non un Iterator en fait) pourrait permettre de simuler une rotation complète en un seul for each, au lieu de 2 (un dans sens, un dans l'autre), ou de bricoler avec des index dans un for.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Inactif  
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2019
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2019
    Messages : 191
    Points : 0
    Points
    0
    Par défaut
    Après ça dépend surtout de ce que tu veux faire dans ta boucle, si tu veux la parcourir valeur par valeur, c'est mieux mais si t'as des conditions plus compliquées un for avec index sera plus approprié

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

Discussions similaires

  1. Pourquoi utiliser Iterator alors qu'on a foreach ?
    Par beegees dans le forum Langage
    Réponses: 4
    Dernier message: 06/03/2014, 18h31
  2. Réponses: 8
    Dernier message: 13/10/2010, 13h33
  3. utilisation de where avec ArrayList
    Par archer dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/06/2010, 15h06
  4. Réponses: 8
    Dernier message: 11/01/2008, 06h51
  5. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 12h30

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