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

Java Discussion :

Iterator et le problème ConcurrentModificationException


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut Iterator et le problème ConcurrentModificationException
    Bonjour,

    Dans mon programme je veux parcourir une liste et la remplir en la parcourant.

    cela est interdit par les Iterator, il m'affiche une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.util.ConcurrentModificationException
    Comment je peux éviter un tel problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     List l = new ArrayList();
     
            l.add(4);
            Iterator it = l.iterator();
            while(it.hasNext())
            {
                System.out.println(it.next()); 
                l.add('c');
            }
    Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par mimish Voir le message
    Comment je peux éviter un tel problème ?
    Par exemple, en remplissant la liste après l'avoir parcourue, ou bien en la parcourant après l'avoir remplie.

    Il y a d'autres solutions, mais celle-ci est la plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Merci pour votre réponse, mais dans mon cas je ne sais pas combien d'élément je peux avoir dans ma list. Dans le parcours d'un arbre par exemple, je ne sais pas combien de fils posséde chaque noeud ! donc je remplie ma list en fur et à mesure.

    est ce qu'il y a une possibilité de parcourir une list et la remplir en même moment ? même si je ne doit pas utilisé une List c'est pas grave, l'essentiel que je trouve une solution qui me permet de parcourir un object et le remplir en même temps.

    Merci

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par mimish Voir le message
    Merci pour votre réponse, mais dans mon cas je ne sais pas combien d'élément je peux avoir dans ma list. Dans le parcours d'un arbre par exemple, je ne sais pas combien de fils posséde chaque noeud ! donc je remplie ma list en fur et à mesure.
    List a une méthode size() qui indique combien elle a d'élément. Donc, je ne sais pas ce que tu essaies de dire, mais en tout cas c'est incorrect quelque part.

    Citation Envoyé par mimish Voir le message
    est ce qu'il y a une possibilité de parcourir une list et la remplir en même moment ?
    Oui, avec son ListIterator. Mais je ne sais pas si tu es dans cette situation. Il est probable que tu n'aies pas besoin de parcourir et remplir en même temps.

    Citation Envoyé par mimish Voir le message
    même si je ne doit pas utilisé une List c'est pas grave, l'essentiel que je trouve une solution qui me permet de parcourir un object et le remplir en même temps.
    C'est un peu trop précis et concret, comme besoin. Tu pourrais essayer d'être un peu plus vague ? Là comme ça on risquerait de comprendre de quoi tu parles.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Merci encore,

    Dans mon cas je veux faire un parcours d'un arbre en largeur. prenons l'exemple suivant, soit l'arbre.
    Root
    A---C-----B
    X--------Y-Z

    Root à 3 fils (A, B et C)
    A possède un seul fils X
    B possède 2 fils Y et Z
    et C n'a aucun fils.

    Dans mon programme, au début, ma liste ne possède que le noeud "Root", et après j'ajoute les fils de Root dans ma list (A C et B) ensuite je parcours ma list (avec un iterator) et je trouve que A posséde un fils X donc je l'ajoute dans la List ... il m'affiche une erreur parceque je parcours la liste et entre temps je la remplis avec d'autre élément !!! voila mon probléme ...

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Sinon, il y a toujours la solution bête et méchante : tu travailles avec deux listes. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List<MonObjet> liste1 = ...
    List<MonObjet> listeAAjouter = new ArrayList<MonObjet>();
     
    for (MonObjet objet : liste1) {
       // On regarde ce qu'on veut sur objet
       listeAAjouter.add(objet);
    }
    // A la fin, on ajoute le tout
    liste1.addAll(listeAAjouter);
    Mako.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Citation Envoyé par Mako 5013 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    List<MonObjet> liste1 = ...
    List<MonObjet> listeAAjouter = new ArrayList<MonObjet>();
     
    for (MonObjet objet : liste1) {
       // On regarde ce qu'on veut sur objet
       listeAAjouter.add(objet);
    }
    // A la fin, on ajoute le tout
    liste1.addAll(listeAAjouter);
    Mako.
    parcontre si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<MonObjet> liste1 = ...
    List<MonObjet> listeAAjouter = new ArrayList<MonObjet>();
     
    for (MonObjet objet : liste1) {
       // On regarde ce qu'on veut sur objet
       listeAAjouter.add(objet);
      liste1.addAll(listeAAjouter);
    }
    ça marche pas et c'est ce que je cherche moi !!!

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Tu veux obtenir quoi en fin de compte ?

    Tu cherches à lister tous les noeuds de ton arbre ? Toutes les feuilles ? Tous les noeuds à une certaine profondeur ?

    Ou bien alors tu cherches à faire des traitements spécifiques sur certains noeuds répondant à certains critères (si oui, lesquels) ?

    Mako.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Je veux juste faire un parcours en largeur de tout mon arbre

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par mimish Voir le message
    Je veux juste faire un parcours en largeur de tout mon arbre
    Oui, ça, tu l'as déjà dit plus haut. Mais tu entends quoi par "parcours en largeur d'un arbre".
    Disons que tu aies une méthode parcoursEnLargeurArbre(Arbre _monArbre), tu veux qu'elle te retourne quoi ?

    Mako.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Disons que chaque noeud posséde une valeur de type entier. elle me retourne une liste d'entier de tous les noeuds suivant le parcours en largeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Integer> breathFirstAlgo(Tree tree)

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je ne vois toujours pas pourquoi tu as besoin de parcourir et modifier la même Liste/objet/chose.

    - Parcourir ton arbre en profondeur, c'est parcourir, ce n'est pas insérer quoi que ce soit.

    - Insérer des objets lus quelques part dans une List qu'on va renvoyer avec return, ça ne nécessite pas de la parcourir ni de la lire, seulement d'insérer des trucs tout le temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<Truc> list = new ArrayList<Truc>(approximateSize);
    for(Truc truc : iterateurDeTrucs) {
      list.add(truc);
    }
    return list;
    On parcourt iterateurDeTrucs et on insère dans list. Deux choses différentes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Par défaut
    Merci à vous deux, c'est bon j'ai pu parcourir l'arbre en largeur sans utiliser les iterator, si quelqu'un cherche la méthode un jour voila la solution :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private List<T> breathFirstAlgo(Node<T> root)
        {  
            List<T> value = new ArrayList<T>();
            List<Node<T>> visited = new ArrayList<Node<T>>();
     
            visited.add(root);
     
            for(int i= 0; i< visited.size(); i++)
            {
                visited.addAll(visited.get(i).getChildren());
                value.add(visited.get(i).getValue());
            }
     
            return value;
     
        }

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

Discussions similaires

  1. Iterator et JQuery : problème d'affichage
    Par forst dans le forum Struts 2
    Réponses: 0
    Dernier message: 18/03/2012, 12h41
  2. Réponses: 3
    Dernier message: 20/04/2007, 17h03
  3. problème avec iterator
    Par akrobat dans le forum C++
    Réponses: 3
    Dernier message: 24/11/2005, 17h23
  4. [EJB2.1 Entity] [BMP] [Struts] Problème avec <logic:iterate>
    Par romain3395 dans le forum Java EE
    Réponses: 2
    Dernier message: 07/06/2004, 10h12
  5. [struts][iterate] problème logic:iterate avec un Vector
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 9
    Dernier message: 31/03/2004, 18h05

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