ich versuche, eine sehr einfache Methode zu schreiben Duplikate in einer LinkedList zu entfernen:Warum gibt das Aufrufen von remove() auf einem Iterator eine ConcurrentModificationException?
ich versuche, dies zu tun, ohne zusätzliche Puffer, so dass ich halte zwei Iteratoren an der verknüpften Liste, macht man die normale Iteration, und eine andere Durchläuft alle vorherigen Knoten, um nach Duplikaten zu suchen (wie in CareerCup angegeben); aber der Compiler sagt mir, es ist ein CME obwohl ich itr1.remove nenne():
public static void RemoveWithoutBuffer(LinkedList l) {
ListIterator itr1 = l.listIterator();
int count1 = 0;
int count2 = 0;
while (itr1.hasNext()) {
Object next = itr1.next();
count1++;
count2 = 0;
ListIterator itr2 = l.listIterator();
while (itr2.hasNext()) {
count2++;
if (count2 == count1)
break;
if (itr2.next() == next){
itr1.remove();
}
}
}
}
Eine andere einfachere Lösung dieses Problems mit Hilfe von Hashset leicht ist wie folgt und keine Ausnahme berichtet:
Ist es, weil, wenn ich durch itr2 iteriere ich kann nicht auf itr1 ändern? Gibt es eine Möglichkeit, das zu beheben? Danke Jungs.
Vielen Dank. Die Lösung ist großartig, verbraucht aber immer noch etwas mehr Platz, obwohl ich denke, dass es im Vergleich zur Verwendung von hashSet mehr Platz spart. Danke für den Link auch. – Superziyi
Wenn Platz von Bedeutung ist, können Sie Elemente als gelöscht markieren (z. B. für Listen auf null setzen oder spezielle Schlüssel mit der Eigenschaft "isRemoved" für Sätze verwenden und die tatsächliche Entfernung später durchführen). –