Warum erhalte ich eine ConcurentModificationException beim entfernen aus einer HashMap?
Möchte ich entfernen Sie ein Element aus der HashMap, durch die Anwendung einer Kriterien. Betrachten Sie diesen code:
Set<Foo> set = myMap.keySet();
Iterator<Foo> itr = set.iterator();
while (itr.hasNext())
{
Foo foo = itr.next();
if (foo.toString().length() < 3) {
myMap.remove(foo); //remove the pair if key length is less than 3
}
}
So bekomme ich einen ConcurentModificationException, weil während der iteration ich bin ändern der HashMap. Was soll ich tun? Gibt es irgendeinen anderen Weg, auf die Suche nach meinen Kriterien und führen Sie die entfernen-Befehl am Ende, damit kann ich vermeiden, diese Ausnahme?
Wenn ich mit try - /catch-block, der zur Laufzeit des Programms ist irgendwo hängen geblieben und cursor hält blinkt. Ich habe um das Programm zu beenden, indem Sie STRG+C Ist es trotzdem kann ich tun, um diese situation zu vermeiden und dennoch in der Lage zu entfernen, die Schlüssel/Wert-paar aus der HashMap
InformationsquelleAutor Mavin | 2010-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
itr.remove()
stattmyMap.remove(o.toString())
In der Tat können Sie die
remove()
Methode auf die keySet-iterator zu löschen, die Schlüssel-Wert-Zuordnung: siehe download.oracle.com/javase/1.4.2/docs/api/java/util/...Nicht manipulieren Sie die Taste.
Ja, ich bin sicher. Entfernen die Taste entfernen Sie den gesamten Eintrag
Ravn Andersen - ich glaube, dass Sie sagen, dass
o.toString()
ist falsch. Richtig? Du hast Recht, aber das ist nicht die Ursache für die OP ' s unmittelbare problem.InformationsquelleAutor a_horse_with_no_name
Als von Java 8, Sammlung bietet
removeIf(Prädikat<? super E>)
, die entfernen Sie alle Elemente, für die das angegebene Prädikat true zurückgibt. Das Beispiel in der Frage könnte umgeschrieben werdenDie default-Implementierung zur Verfügung gestellt von der Sammlung verwendet einen iterator und fordert
Iterator.remove
, aber Sammlungen können dies überschreiben, wenn Sie eine bessere Implementierungen. Noch wichtiger ist, code mitremoveIf
ist klarer und übersichtlicher.InformationsquelleAutor Jeffrey Bosboom
Wenn Sie das entfernen element während der iteration verwenden Sie den Iterator.remove() statt. Ansonsten wird die aktuelle Iterator-Objekt betritt inkonsistenten Zustand, der die Ausnahme verursacht. Sie können mit Map.entfernen(Taste), wenn Sie wissen, Schlüssel, D. H., wenn Sie nicht Durchlaufen die gleiche Karte.
Diese Regel ist korrekt für alle Kollektionen (Listen, Mengen etc).
InformationsquelleAutor AlexR
Ja -
itr.remove()
Den
Iterator
deskeySet()
erweitert dieHashIterator
, derenremove()
MethodenaufrufeHashMap.this.removeEntryForKey(key);
Erhalten Sie auch die
entrySet()
wenn müssen Sie sowohl den Schlüssel als auch den Wert - seine iterator hat die gleiche Eigenschaft.InformationsquelleAutor Bozho
Tun, was Sie beschreiben, ich persönlich mag zu verwenden, funktionalen Stil Programmierung:
Den code-snippet verwendet die google collections library. Es wird eine Sicht erstellt, der die original-Karte, indem Sie nur diejenigen Einträge, die den Tasten entsprechen, die gelieferten Prädikat.
InformationsquelleAutor ytoh