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 :

Pourquoi utiliser des Iterators() quand on peut autrement ?


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut Pourquoi utiliser des Iterators() quand on peut autrement ?
    Bonjour,

    j'aurais une question générale.

    Nous savons que le parcours des collections peut se faire à l'aide d'Iterator. Mais quel en est l'interêt lorsque l'on connaît par exemple le nombre d'élèments dans cette liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    List<int> maListe = new ArrayList<int>(nbElem);
     
    for(int i=1; i<=nbElem; i++) 
    {
    	maListe.get(i);
            System.out.println("élément n° "+ i +" dans la liste");
    }

    Est-il plus propre d'utiliser les itérators pour parcourir une collection dans ce cas ?

    Merci.

    Pirokkk.

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    On peut toujours parcourir la liste autrement, puisque l'interface Collection dispose d'une méthode size() qui renvoie sa taille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0; i<liste.size(); i++) { quelqueChose(liste.get(i)); }
    L'utilisation d'un Iterator permet surtout d'optimiser les performances de ton application. En ce sens, le code est plus "propre" car plus optimisé.

    Cette information est toutefois à nuancer car elle dépend de l'implémentation réelle de la liste. En fonction de son utilisation (accès à un élément par son indice, parcours complet à chaque utilisation...) il vaut mieux privilégier une implémentation ou une autre (ArrayList, LinkedList, ...)

  3. #3
    Membre averti Avatar de alceste
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 318
    Points : 356
    Points
    356
    Par défaut
    même sans connaître le nombre d'élément tu peux utiliser une boucle for, mais la boucle for étendue.

    http://java.developpez.com/faq/java/...BLEAU_parcours

  4. #4
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 571
    Points : 15 538
    Points
    15 538
    Par défaut
    Pour un ArrayList l'utilisation ou non de l'itérateur n'a pas vraiment d'importance, vu que l'utilisation de l'itérateur fait la même chose en interne qu'une boucle sur l'indice.

    Par contre, dans le cas d'une liste chainée comme une LinkedList, un get() sera plus lent que l'utilisation d'un itérateur, vu que l'itérateur parcours la chaine au fur et a mesure, alors que le get va la reparcourir jusqu'à arriver à la valeur cherchée à chaque appel.

    Ceci dit si tu peux utiliser le for amélioré, fait le. C'est de loin le plus clair.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(Objet obj : listeObjets){
    }

  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
    Salut,

    Citation Envoyé par Pirokkk Voir le message
    Est-il plus propre d'utiliser les itérators pour parcourir une collection dans ce cas ?
    Perso je dirais qu'il faut toujours utiliser des Iterators...

    Dans le cas précis l'utilisation directe de la boucle pourraient peut-être t'amener à une amélioration des performances (et encore je pense qu'il faudrait un très grand nombre d'élément pour que ce soit sensible), mais seulement parce que tu utilises une ArrayList...

    Connaitre ou pas le nombre d'élément de la liste n'a aucune incidence : le principal facteur est l'organisation interne de la collection. Avec une ArrayList l'accès par index est très rapide donc c'est OK, mais c'est exactement le contraire avec une LinkedList par exemple.


    En effet lorsque tu fais un accès par index sur une LinkedList, tu es obligé de parcourir tous les éléments un à un à chaque fois : un get(50) parcourera les 50 premiers éléments... ce qui aboutit à des performances vraiment catastrophique (et là la perte se fait vite sentir).




    Le choix de l'iterator est le meilleur choix dans 99% des cas...


    a++

    [edit] Oups bien grillé...

    Note : le for amélioré de Java 5.0 utilise les Iterator

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Et pour "remplir" une liste, dans ce cas on est bien obligé d'utiliser un parcours avec une boucle classique en connaissant le nombre d'éléments à inserer non ?
    Iterator ou boucle "for each", ça ne marchera pas j'imagine...

  7. #7
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    L'iterator sert effectivement à parcourir une liste déjà existante, pas à la construire.

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Okayyy c'est cool !

    Je crois que c'est tout ce que je voulais savoir !
    Merci à tout le monde pour vos réponse !

    A bientot.

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 847
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tant l'Interator que le foreach (qui fait exactement la meme chose mais de maniere cachee - == sucre syntaxique -), evitent bien sur egalement des problemes dans la manipulation des indices (nottament quand on se trompe sur le test de fin, qu'on oublie ou fait des erreurs dans l'incrementation ou encore qu'on melange des indices lors de boucles inbriquees par exemples).

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

Discussions similaires

  1. [VxiR2] Pourquoi utiliser des types d'objet Information ?
    Par Ptolémée dans le forum Designer
    Réponses: 5
    Dernier message: 07/04/2011, 17h25
  2. Réponses: 8
    Dernier message: 13/10/2010, 12h33
  3. Réponses: 1
    Dernier message: 12/03/2008, 10h38
  4. Réponses: 3
    Dernier message: 19/12/2005, 13h39

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