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

Discussion :

Inconvenient boucle for pour parcourir les conteneurs (collections)

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut Inconvenient boucle for pour parcourir les conteneurs (collections)
    Bonjour,

    Tout d'abord, si jamais le post est répétitif, veuillez m'en excuser. J'ai beaucoup cherché sur le forum et d'autres sites web et je n'ai pas trouvé de réponses correspondant à mon cas.

    J'ai récemment eu un cours sur les conteneurs, principalement des classes implémentant les interfaces List et Set. Nous avons donc développer le cours sur 2 classes: les linkedList et les treeSet.

    Lorsque l'on utilise ces collections, il parraît donc intéressant de les parcourir. Nous avons donc vu à cet occasion l'utilisation des iterateur.
    On a donc les possibilités suivantes de parcour:
    -linkedList: parcour via une boucle for ou un iterateur (boucle while)
    -treeSet: parcour via un iterator (à cause du fait que l'on est basé sur une structure de type arbre binaire je suppose).

    De ce que j'ai pu lire sur internet, le gros avantage de l'iterator est qu'il est bien plus rapide comparé au for.
    Néanmoins, mon professeur nous a présenté un "autre" inconvénient qui est très confus dans ma tête et que je n'ai pu trouvé sur internet:

    Les boucles for ne serait pas "dynamique" alors que les boucles "while" le seraient.
    En gros, lorsque l'on a une liste et que java compile le code, la boucle for se base sur le premier model de liste qu'il a rencontré, et n'est alors plus adapté si l'on supprime un élément et plante.
    Je n'ai vraiment pas compris ce à quoi il faisait référence (et j'ai pourtant posé beaucoup de questions pour essayer de comprendre) et personne dans ma classe n'a compris.
    En faisant des recherches, je suis tombé sur l'erreur "ConcurrentModificationException" mais je ne suis même pas sûre que ce soit de ça dont il parlait.

    Par ailleurs, je ne comprends pas ce qu'il entend par "dynamique" ? Pour moi, dans la mesure où l'on utilise un for, on ne sait pas forcément combien d'élément le loop parcourera ?

    Quelqu'un aurait une idée ? En espérant avoir été "à peu près" claire.

    Merci par avance

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Attention, si tu utilises un for c'est justement que tu connais le nombre d'éléments. Du moins dans son cas d'utilisation que j'appellerai "propre".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; i< tab.length(); i++)
    De ce fait il a raison de dire que ce n'est pas dynamique si tab.length() n'est pas réévalué à chaque itération (sous-entendu tu supprimes un élément de ton tableau de 7 mais à la boucle continue jusqu'à 7 et donc provoque une erreur d'index). Mais cela m'étonnerai fort qu'un langage tel que Java n'évalue pas l'expression à chaque itération...

    Après l'itérateur c'est justement une évaluation dynamique de ta donnée. Les itérateurs pouvant être utilisés dans une boucle for c'est sur cela qui me fait dire que ton professeur a raconté n'importe quoi concernant mon paragraphe ci-dessus. L'itérateur évalue à chaque appel s'il existe un élément suivant le courant et avance son "pointeur" vers la prochaine donnée.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Merci beaucoup !
    Oui c'est pour cela que je suis perplexe quant à cette affirmation car j'ai l'impression que l'on réévalue correctement.
    j'ai essayé de coder justement en faisant une fonction d'affichage utilisant un for.
    juste en affichant pas de soucis.
    Ensuite j'ai essayé de supprimer un élément en pleins milieu de la boucle ou d'en ajouter un et tout se passe très bien.
    La seule chose est qu'il faut faire attention au print:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=0; i> listTest.length(); i++
    {
       systemoutprintln(listTest[i])
       if (listTest[i] == "b")
           {
           listTest.remove("b")
           systemoutprintlk(listTest[b]
           }
    }
    Le deuxième print est donc important sinon on saute un élément dans la liste, car la suppression décale les éléments.
    Mais je ne comprends pas où est le problème. Ce test prouve bien qu'il y a une réévaluation

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    C'est pour ça que je te disais qu'à mon avis :
    - soit tu as mal interprété ce que t'a expliqué ton professeur
    - soit il est dans les choux

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par menina_raquel Voir le message
    Ce test prouve bien qu'il y a une réévaluation
    Ton test montre que dans ton cas, avec ce langage et cette version du compilateur et de la machine virtuelle, il y a re-evaluation.

    Est-ce le cas dans tous les langages, et dans toutes les implementations de tous les compilateurs ? Il est certain que non.

    Modifier une liste que tu es en train de parcourir doit toujours etre fait a la main, et ne doit jamais se reposer sur une interpretation de l'implementation.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Par défaut
    Mon cas c'est surtout par rapport au java sinon j'aurais posté sur un autre topic ...
    Donc en gros ce serait eclipse qui ferait la différence ? Et potentiellement sa version ?

    En résumé et je cite mon prof: "les boucles for sont le gros point faible de java"
    Je lui demanderai quand je le reverrai parce que sur le coup je m'étais dit : je testerai chez moi et je ferai quelques recherches, souvent ça aide à mieux comprendre ...

    merci quand même

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par menina_raquel Voir le message
    En résumé et je cite mon prof: "les boucles for sont le gros point faible de java"
    Tu pourras lui dire que je ne suis pas d'accord avec lui

    Une boucle for, dans le concept, a pour but de parcourir quelque chose dont on connait a l'avance le nombre d'elements. L'utilisation la plus simple est, par exemple, l'initialisation d'un tableau a une valeur par defaut avant la vraie utilisation.

    Apres, vouloir utiliser un for pour un ensemble dont on va modifier le nombre d'elements, c'est un peu comme prendre l'avion pour aller de Chatelet a La Defense : c'est techniquement possible, mais ce n'est pas la meilleure solution du tout.

    Tu veux modifier ton ensemble ? La logique veut alors que tu prennes une structure de boucle qui verifie systematiquement la condition d'arret, et que tu fasses toi-meme l'iteration vers le prochain element. Donc oui, tu utilises un while dans ce cas.

    A l'inverse, utiliser un while pour initialiser un tableau aura tendance a etre moins lisible qu'un for.

    Apres bien sur, ce n'est que mon avis, et je suis tout a fait ouvert a la discussion -- qui est par ailleurs totalement independante du langage.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. Boucle for pour remplacer les virgules dans un userform
    Par floflo50100 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/04/2015, 16h27
  2. [Débutant] FOR pour parcourir les mois d'une année !
    Par Naografix dans le forum C#
    Réponses: 2
    Dernier message: 20/01/2015, 11h55
  3. boucle for pour trier les doublons
    Par gerald57 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2008, 15h40
  4. Réponses: 2
    Dernier message: 29/08/2006, 13h59
  5. [OnClick]ignoré si on utilise tab pour parcourir les textbox
    Par ozzmax dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2005, 22h40

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