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.
