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

Collection et Stream Java Discussion :

[Collections] Synchroniser un iterator


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut [Collections] Synchroniser un iterator
    Bonjour,

    j'avais une partie de code qui utilisait des hashtable et des enumeration. J'ai converti tous les hashtable en treemap et les enumeration en iterator pour remettre aux gouts du jour =)
    Cependant, à un endroit précis, j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Iterator clesFils = fils.keySet().iterator();
     
                while (clesFils.hasNext()) {
                   String cleTemp = (String)clesFils.next();
                    Fil filTemp = ((Fil)fils.get(cleTemp));
                    if (filTemp.estRelieA(codeElem))    supprimerFil(cleTemp);
                }
    Ce qui engendre une erreure ConcurrentModificationException, je crois.
    Tout ceci est du au fait que la methode supprimerFil implique des changements sur le treeMap "fils" et donc l'iterator n'aime pas.
    Après avoir fait quelques recherches, j'ai essayé de synchroniser l'iterator et cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Set s = Collections.synchronizedSet(fils.keySet()); 
             synchronized(s) {
            Iterator clesFils = s.iterator();
     
                while (clesFils.hasNext()) {
                   String cleTemp = (String)clesFils.next();
                    Fil filTemp = ((Fil)fils.get(cleTemp));
                    if (filTemp.estRelieA(codeElem))    supprimerFil(cleTemp);
                }
             }
    Et cela ne résoud pas mon problème, malheureusement. Ai je mal fait quelque chose ?
    Sous netbeans, voila ce qu'il me met :
    Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1031)
    at java.util.TreeMap$KeyIterator.next(TreeMap.java:1058)
    at saisieschema.FenetreEditeurSchema.supprimerElement(FenetreEditeurSchema.java:1060)
    Si vous avez des idées, merci !

  2. #2
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Pour supprimer un élément il faut utiliser la méthode remove de l'interface Iterator.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    oui mais je ne vois pas en quoi ca résoud mon problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void supprimerFil(String codeFil)  {
            Fil filASupprimer = ((Fil)fils.get(codeFil));
            filASupprimer.deconnecterFil(elements,fils);
            int sortieFil = filASupprimer.getSortie();
            fils.remove(codeFil);
     
            // on supprime les noeuds isolés
            eliminerNoeudsIsoles();
     
            updateGrilleTraces();
    J'utilise bien un fils.remove(key) dans la methode supprimerFil

  4. #4
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Ce n'est pas un remove sur l'iterator mais sur le TreeMap.
    Moi je dis un remove sur l'iterator.

  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,

    Ce que veux dire zekey c'est que pendant le parcours d'une Collection avec un itérateur, il est interdit de modifier la collection !

    Ce n'est pas un problème de synchronisation multithread mais bien d'algorythme.

    Citation Envoyé par ceres02
    J'utilise bien un fils.remove(key) dans la methode supprimerFil
    Justement l'erreur vient de là ! Tu devrait faire :
    a++

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    Ca a l'air de marcher impec.
    J'ai recrée une 2nd méthode supprimerFil avec l'iterator en argument car j'ai besoin d'une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void supprimerFil(String codeFil, Iterator clesFils)  {
            Fil filASupprimer = ((Fil)fils.get(codeFil));
            filASupprimer.deconnecterFil(elements,fils);
            int sortieFil = filASupprimer.getSortie();
     
            clesFils.remove();
     
            // on supprime les noeuds isolés
            eliminerNoeudsIsoles();
     
            updateGrilleTraces();
        }
    Ma question est: j'ai du enlever le fils.remove(codeFil) mais pour du coup, je n'efface plus les fils de mon TreeMap. est ce que clesFils.remove() s en charge implicitement ?

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Par défaut
    je viens de lire la javadoc, ca répond toujours à nos questions
    merci encore pour votre aide =)

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

Discussions similaires

  1. Affichage d'une Collection avec logic:iterate
    Par koukoya dans le forum Struts 1
    Réponses: 5
    Dernier message: 04/10/2006, 11h52
  2. [Iterate] rowspan dynamique et taille de Collection
    Par yolepro dans le forum Struts 1
    Réponses: 5
    Dernier message: 27/07/2006, 12h14
  3. [struts]Cannot create iterator for this collection
    Par jamal_b dans le forum Struts 1
    Réponses: 3
    Dernier message: 13/04/2006, 17h00
  4. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  5. [Collections] L'interface "Iterator" à quoi ça sert
    Par Samanta dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 07/04/2005, 17h51

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