Comment faire pour supprimer et ajouter des éléments à TreeMap lors de l'itération?
Je veux écrire du code comme celui -
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
map.put(x, value);
}
mais j'ai eu java.util.ConcurrentModificationException
J'ai essayé d'utiliser Iterator
aussi mais j'ai eu le même Exception
J'ai googlé pour cela et trouve cette question sur la première place. Google n'est pas suffisant, le contenu est également nécessaire 🙂
U peut pls joindre le code de l'itérateur. Le code ci-dessus va certainement donner u en même temps une modification de l'Exception. Vous êtes une itération à travers le jeu de clés ainsi que la modification de la carte en même temps. C'est une recette pour le désastre.
Ajout d'une réponse ci-dessous avec un exemple de code.
U peut pls joindre le code de l'itérateur. Le code ci-dessus va certainement donner u en même temps une modification de l'Exception. Vous êtes une itération à travers le jeu de clés ainsi que la modification de la carte en même temps. C'est une recette pour le désastre.
Ajout d'une réponse ci-dessous avec un exemple de code.
OriginalL'auteur Mahmoud Hanafy | 2013-05-19
Vous devez vous connecter pour publier un commentaire.
Explication pourquoi il a causé
ConcurrentModificationException
boucle for-each également créer en interne un itérateur de la
entrySet
demap
. Lors de l'itération sur la carte que vous avez modifié la structure de la map en mettant de nouveau la valeur de la carte (map.put(x,value)
) qui provoquent ceConcurrentModificationException
.Il est même bien expliqué dans la documentation -
Comment résoudre ce -
vous devez changer la changer la structure de cette carte lors de l'itération, vous pouvez insérer ces valeurs, plus tard, à l'instar de garder une carte temporaire et les ajouter à la carte principale une fois que l'itération est fini son travail.
OriginalL'auteur Subhrajyoti Majumder
Itérer sur une copie et vous pouvez ajouter/supprimer parfaitement:
Il n'est même pas plus de lignes de code, parce que la copie ims fait en ligne via le constructeur de copie.
LinkedHashMap
a été choisi afin de préserver l'itération de commande (si ce qui compte).OriginalL'auteur Bohemian
Un échantillon extrait de code pour supprimer un élément à partir de la carte est donnée ci-dessous.
Si votre code comporte beaucoup d'ajout et de suppression , vous pourriez vouloir utiliser ConcurrentHashMap.ConcurrentHashMap
it.next()
n'est pas booléenne et sur le dessus de cela lorsque l'itérateur n'a pas plus d'éléments, .next() ne sera pas nulle, mais plutôt de jeterjava.util.NoSuchElementException
. Ainsi, l'utilisation deit.hasNext()
OriginalL'auteur SamDJava
Vous devez créer une copie de votre carte à l'aide du constructeur de copie. Maintenant itérer sur 1 et modifier deuxième carte.
Je suis en supposant que vous n'aurez pas besoin d'effectuer une itération nouvellement valeur ajoutée comme il l'habitude de faire beaucoup de sens.
Vous pouvez atteindre votre tâche en créant une copie est parce que les clés restent identiques dans les deux.
EDIT:
Je ne pense pas que c'est une bonne idée pour l'itération nouvellement ajout d'un élément à une table de hachage. Si vous cochez l'api fournis par l'Itérateur ensuite, vous trouverez la seule méthode remove, il n'existe pas de méthode add. Il y a une raison derrière cela et vous pouvez vérifier la javadoc de cette.
Arrive maintenant au point, sur la façon d'effectuer une itération nouvellement ajout d'un élément.
HashMap
. Afin de vous effectuer une itération de l'un et de modifier les autresMap
.Map
, je voudrais utiliserListIterator
pour cette [ceci est différent de la normaleIterator
].keyset
de Map1 et la convertir en une liste à l'aide deArrayList(Collection<? extends E> c)
.ListIterator
deList
créé à l'étape 3, et d'ajouter, de supprimer des éléments dansListIterator
ainsi que dans Map2 [n'oubliez pas que vous devez ajouter , supprimer à la fois dansListIterator
et Map2].voir mon edit. En utilisant de nouveaux étapes supplémentaires que vous pouvez effectuer d'ajouter et de supprimer à la fois.
OriginalL'auteur Lokesh
Parce que vous ne pouvez pas le faire.
Une solution facile est d'utiliser une autre carte temporaire où vous mettez les valeurs que vous voulez et finalement passer des pointeurs avec l'original (j'.e Carte = newMap )
puis faire une boucle while et continuez à faire cela jusqu'à ce que vous avez terminé.
OriginalL'auteur Ahmad