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 :

for: résoudre ConcurrentModificationException


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut for: résoudre ConcurrentModificationException
    Bonjour à tous,

    En utilisant un for et un remove simultanément, j'ai rencontré une ConcurrentModificationException sur cette construction:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        HashMap<String,String> h = new HashMap<String,String>();
        h.put("mot1","foo");
        h.put("mot2","bar");
        h.put("mot3","foobar");
        for (String key: h.keySet()) {
          if (h.get(key).equals("bar")) 
            h.remove(key);
        }
    ... ce qui est une erreur de débutant classique semble-t-il. La construction suivante est-elle une manière correcte de la contourner ? Je saisis mal le fait que la méthode() remove s'applique bien à l'élément qui avait été sélectionné par l'appel à next().


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Iterator<String> it = h.keySet().iterator();
        while (it.hasNext()) {
          if (h.get(it.next()).equals("bar"))
            it.remove();
        }
    Cordialement,

    G.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui, c'est correct, remove retire bien le dernier élément qui a été retourné par next.

    Cependant, ce n'est pas la méthode la plus rapide pour parcourir une map, ce code est préférable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Iterator<Map.Entry<String,String>> it = h.entrySet().iterator();
        while (it.hasNext()) {
          Map.Entry<String,String> entry = it.next();
          if (entry.getValue().equals("bar"))
            it.remove();
        }
    Cela évite la création d'une collection intermédiaire pour le keyset.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Points : 87
    Points
    87
    Par défaut
    Un grand merci, je ne connaissais pas Map.Entry

    Citation Envoyé par tchize_ Voir le message
    [...] ce n'est pas la méthode la plus rapide pour parcourir une map, ce code est préférable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Iterator<Map.Entry<String,String>> it = h.entrySet().iterator();
        while (it.hasNext()) {
          Map.Entry<String,String> entry = it.next();
          if (entry.getValue().equals("bar"))
            it.remove();
        }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/02/2015, 18h40
  2. Réponses: 5
    Dernier message: 04/08/2003, 22h50
  3. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 17/02/2003, 07h48
  4. [VB6] For Each ... In ...
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/02/2003, 13h56
  5. commande dos pour résoudre une adresse ip
    Par stephy dans le forum Développement
    Réponses: 2
    Dernier message: 17/12/2002, 15h04

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