Java Iterator remove() Methode
-
Einführung in die Methode
remove()
vonCollection
-
Verwenden Sie die
remove()
-Methode vonCollection
-
Einführung in die Methode
remove()
vonIterator
-
Verwenden Sie die Methode
remove()
desIterators
Java-Entwickler müssen beim Iterieren oft das Element oder Objekt aus der ArrayList
entfernen.
Hier tritt das Problem auf, wenn sie versuchen, das Objekt aus der ursprünglichen Sammlung zu entfernen, während sie es durchlaufen, da es die ConcurrentModificationException
auslöst. In diesem Artikel erfahren Sie, wie die Methode remove()
des Iterator
und die Methode remove()
der Collection
unterschiedlich funktionieren.
Einführung in die Methode remove()
von Collection
In Java ist Collection
eine Schnittstelle, die verschiedene Datentypen wie ArrayList
, Set
usw. enthält. Um ein Element aus der Collection
zu entfernen, können wir die Methode remove()
verwenden, indem wir die Sammlung übernehmen Als Referenz.
Benutzer können der folgenden Syntax folgen, um die Methode remove()
mit der Sammlung zu verwenden.
collection.remove(Ind);
Ind
– Die remove()
-Methode entfernt Elemente aus dem Ind
-Index der referenzierten Sammlung
.
Verwenden Sie die remove()
-Methode von Collection
Im folgenden Beispiel haben wir die Sammlung erstellt und das Element aus dem 2. und 4. Index mit der remove()
-Methode der Sammlung
entfernt.
import java.util.ArrayList;
class Test {
public static void main(String[] args) {
// Create an ArrayList
ArrayList<String> testList = new ArrayList<String>();
// Add elements in the ArrayList
testList.add("Apple");
testList.add("Banana");
testList.add("Cat");
testList.add("Dog");
testList.add("Fox");
testList.add("Cow");
// Removing the element at index 2 and 4
System.out.println(testList.remove(2) + " removed\n");
System.out.println(testList.remove(4) + " removed");
}
}
Ausgang:
Cat removed
Cow removed
In der obigen Ausgabe können Benutzer sehen, dass sich alle Elemente in ArrayList
um einen Index verschieben, sobald wir die Katze
aus dem 2. Index entfernen.
Wenn wir versuchen, das Element aus dem 4. Index zu entfernen, nachdem wir das Element aus dem 2. Index entfernt haben, entfernt die Methode remove()
das Element aus dem 5. Index der eigentlichen ArrayList
, da alle Elemente nach dem 2. Index nach verschoben wurden links von 1.
Wir haben gelernt, wie die Methode remove()
der Collection
normal funktioniert.
Einführung in die Methode remove()
von Iterator
Nun stellt sich die Frage, was ist der Unterschied zwischen den Methoden remove()
von Iterator
und Collection
, da beide das Element aus der Collection
entfernen?
Lassen Sie uns das Problem mit dem folgenden Code verstehen.
import java.util.ArrayList;
class Test {
public static void main(String[] args) {
// Create an ArrayList
ArrayList<String> testList = new ArrayList<String>();
// Add elements in the ArrayList
testList.add("Apple");
testList.add("Banana");
testList.add("Cat");
testList.add("Dog");
testList.add("Fox");
testList.add("Cow");
for (String element : testList) {
if (element.equals("Cat")) {
testList.remove(element);
}
}
}
}
Im obigen Beispiel haben wir die ArrayList
aus verschiedenen Strings erstellt. Wir durchlaufen die ArrayList
mit der for
-Schleife und prüfen, ob wir versuchen, es mit der collection.remove()
-Methode zu entfernen, wenn das Element gleich cat
ist.
In der Ausgabe können Benutzer sehen, dass die Ausnahme ConcurrentModificationException
ausgelöst wird, wenn wir die ursprüngliche Liste ändern, während wir sie durchlaufen.
Ausgang:
Exception in thread "main" java.util.ConcurrentModificationException
Um unser Problem zu lösen, können wir den Iterator
verwenden, um die ArrayList
zu durchlaufen, und die remove()
-Methode des Iterator
, um das Element zu entfernen.
Verwenden Sie die Methode remove()
des Iterators
Im Beispiel unten haben wir den Iteratornamen itr
für die ArrayList
des Strings erstellt. Wir iterieren durch die ArrayList
mit der for
-Schleife und itr
.
Außerdem entfernen wir das Fox
-Element aus der ArrayList
, während wir es durchlaufen.
import java.util.ArrayList;
import java.util.Iterator;
class Test {
public static void main(String[] args) {
// Create an ArrayList
ArrayList<String> testList = new ArrayList<String>();
// Add elements in the ArrayList
testList.add("Apple");
testList.add("Banana");
testList.add("Cat");
testList.add("Dog");
testList.add("Fox");
testList.add("Cow");
// Removing the "Fox" while iterating through the `testList`
Iterator<String> itr = testList.iterator();
while (itr.hasNext()) {
String element = itr.next();
if (element.equals("Fox")) {
testList.remove(element);
}
}
System.out.println(testList);
}
}
Ausgang:
[Apple, Banana, Cat, Dog, Cow]
Wir können beobachten, dass Fox
entfernt wird, während die ArrayList
in der obigen Ausgabe durchlaufen wird.
Verstehen Sie den Code der Methode remove()
von Iterator
Wir haben den folgenden Pseudocode der Methode remove()
des Iterators
aus den offiziellen Dokumenten von Java entnommen. Benutzer können sehen, dass es auch die remove()
-Methode von ArrayList
verwendet, aber auch den expectedModCount
aktualisiert, der die ConcurrentModificationException
-Ausnahme nicht auslöst.
Es ist immer erforderlich, das nächste Element zu kennen, wenn wir durch die ArrayList
iterieren. Wenn wir also versuchen, die ursprüngliche Liste mit der Methode remove()
zu ändern, wird der nächste Index nicht aktualisiert und der Fehler ausgegeben, und dieses Problem wird in der Methode remove()
des Iterators
überwunden.
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
Außerdem können Benutzer die Liste klonen und die neue Liste durchlaufen. Beim Durchlaufen der neuen Liste können sie das Element aus der ursprünglichen Liste entfernen.