Objekte aus einer List löschen
-
es funktioniert bei mir nicht (Exception)
vermutlich weil mit dem löschen von entry dann die Schleife durcheinander kommt
-
java.util.ConcurrentModificationException
-
in der Zeile mit dem for:
at java.util.LinkedListListItr.next(LinkedList.java:552)
-
for (ListIterator i = list.listIterator(); i.hasNext(); ) { Typ entry = (Typ)i.next(); if (...) list.remove(entry); }
scheitert mit demselben Fehler
-
ConcurrentModification sagt doch eigentlich alles. Du änderst in einem anderen Thread was an der Liste, stimmts.
Und dann ist sie wohl nicht mehr so gültig wie du es gern haben würdest, und Iteratoren sind aus dem Grund failfast und du bekommst die Exception.
Evtl hilft Code, wo du die Liste erzeugst und füllst.
-
Dann musst du es wohl auf die "altmodische" Weise machen:
for (int i = 0; i < list.size(); ++i) { if (...) list.remove(i--); }
-
Griffin schrieb:
ConcurrentModification sagt doch eigentlich alles. Du änderst in einem anderen Thread was an der Liste, stimmts.
ich habe nur einen Thread
-
Das von Pogo geht, aber size() und at() und remove() ist für eine LinkedList doch total ineffizient?
-
Wenn bei deinem Programm jede Nanosekunden zählt, dann könntest du die Größe ja auch vorher speichern. Damit würde der size()-Aufruf schonmal nur einmalig sein.
Das mit dem at() - ich nehme mal an, das ist das selbe wie get() - ist nicht wirklich ein Problem. Irgendwie musst du ja an die Objekte der Liste kommen. Dazu musst du halt get() benutzen. Die erweiterte for-Schleife muss das genauso tun. Du siehst zwar nicht, dass sie es tut, aber doch muss sie es ja tun.
Also nimmt sich das nichts.
Schneller als eine LinkedList könnte eine ArrayList sein.EDIT: Nach meiner Api Doc hat keine List eine Methode at().
EDIT2:
Ein bisschen Code, damit es auch alle verstehen:
Object object; int size = 0; size = list.size(); for (int i = 0; i < size; ++i) { object = list.get(i); if (!iLikeThisOne(object)) { list.remove(i--); --size; } }
Ich denke nicht, dass size() irgendwie ineffizient ist. Ich nehme mal, dass es lediglich eine Member-Variable size der WasWeisIchList zurückgibt und das kann man, glaube ich, nicht großartig falsch machen.
Aber da du es ja eilig hast, sparst du dir wenigstens die Zeit, die beim wiederholten Aufruf der Methode verloren geht, indem du die Größe halt vorher speicherst.
-
for (ListIterator i = list.listIterator(); i.hasNext(); ) { Typ entry = (Typ)i.next(); if (...) i.remove(); }
Dass die Programmierer an sowas dachten, ist ja wohl anzunehmen (deshalb können Iteratoren gleich selbst Elemente entfernen - ohne durcheinander zu kommen)
-
@JBeni: thx