Es gibt zwei Möglichkeiten, Objekte aus der ArrayList in Java zu entfernen: erstens mithilfe der remove() -Methode und zweitens mithilfe des Iterators. ArrayList bietet eine überladene remove() -Methode, einen Accept-Index des zu entfernenden Objekts, dh remove(int index), und ein anderes accept-Objekt, das entfernt werden soll, dh remove(Object obj) . Faustregel ist, Wenn Sie den Index des Objekts kennen, verwenden Sie die erste Methode, andernfalls die zweite Methode. Übrigens müssen Sie daran denken, ArrayList remove Methoden zu verwenden, nur wenn Sie nicht über ArrayList iterieren, wenn Sie iterieren, dann verwenden Sie Iterator .remove() -Methode, andernfalls kann dies zu ConcurrentModificationException in Java führen. Ein weiteres Problem kann aufgrund von Autoboxen aufgetreten sein. Wenn Sie genau hinsehen, sind die beiden remove Methoden remove(int index) und remove(Object obj) nicht zu unterscheiden, wenn Sie versuchen, aus einer ArrayList von Ganzzahlen zu entfernen.Angenommen, Sie haben drei Objekte in ArrayList dh und Sie möchten das zweite Objekt entfernen, das 2 ist. Sie können remove(2) aufrufen, was eigentlich ein Aufruf von remove(Object) ist, wenn Sie autoboxing in Betracht ziehen, aber als Aufruf zum Entfernen des 3. Elements interpretiert wird, indem Sie als remove(index) interpretieren.
Ich habe dieses Problem früher in meinem Artikel über Best Practices beim Überladen von Methoden in Java besprochen. Aufgrund der weniger bekannten Erweiterungsregel und des Autoboxings kann eine schlecht überladene Methode zu viel Mehrdeutigkeit führen.
Codebeispiel Zum Entfernen von Elementen aus ArrayList
Testen wir die obige Theorie mit einem einfachen Codebeispiel für ArrayList mit Ganzzahlen. Das folgende Programm hat eine ArrayList von ganzen Zahlen, die 1, 2 und 3 enthalten, dh dies entspricht genau dem Index.
Paket test;Java importieren.util.ArrayList;Java importieren.util.List;/** * * @author http://java67.blogspot.com */public class JavaTutorial{ /** * @param Argumente die Befehlszeilenargumente */ public static void main(String args) { List<Integer> numbers = new ArrayList<Ganzzahl>(); Zahlen.addiere(1); Zahlen.addiere (2); Zahlen.hinzufügen(3); System.aus.println("ArrayList enthält : " + Zahlen); // Aufruf entfernen(Index) Zahlen.remove(1); // Objekt am Index 1 entfernen, dh 2. Objekt, das 2 ist // remove(object) -Nummern aufrufen.remove(3); }} Ausgabe: ArrayList enthält: Ausnahme im Thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Größe: 2 bei Java.util.ArrayList.rangeCheck(ArrayList.java:635) bei Java.util.ArrayList.entfernen(ArrayList.java: 474) beim Test.Test.haupt(Test.java:33)Java Ergebnis: 1
Sie können sehen, dass der zweite Aufruf auch als remove(index) behandelt wird. Der beste Weg, um Mehrdeutigkeiten zu beseitigen, besteht darin, Autoboxing zu entfernen und ein tatsächliches Objekt bereitzustellen, wie unten gezeigt.
System.aus.println("ArrayList Before : " + numbers);// Aufruf von remove(Index) -Nummern.remove(1); // Objekt am Index 1 entfernen, dh 2. Objekt, das 2 ist // remove(object) -Nummern aufrufen.remove(neue Ganzzahl(3));System.aus.println("ArrayList After : " + numbers);Ausgabe :ArrayList Before : ArrayList After :
Dieses Mal funktioniert es, aber ich habe Angst vor faulen Entwicklern wie mir, was Autoboxing selbstverständlich macht. Werfen wir nun einen Blick darauf, das Objekt aus der ArrayList zu entfernen, während wir über sie iterieren. Sie müssen mit Iterator in Java vertraut sein, bevor Sie fortfahren.
Objekt mit Iterator aus ArrayList entfernen
Dies ist eigentlich ein subtiles Detail der Java-Programmierung, das für Anfänger nicht offensichtlich ist, da sich der Compiler nicht beschwert, selbst wenn Sie die remove() -Methode aus Java verwenden.util.ArrayList , während Iterator . Sie werden Ihren Fehler nur erkennen, wenn Sie ConcurrentModificationException sehen, was selbst irreführend ist, und Sie können unzählige Stunden damit verbringen, einen anderen Thread zu finden, der diese ArrayList aufgrund von gleichzeitigem Wort ändert. Sehen wir uns ein Beispiel an.
public static void main(String args) { Liste<Ganzzahl> Zahlen = neue ArrayList<Ganzzahl>( ); zahlen.addiere (101); Zahlen.addiere (200); Zahlen.add(301); Zahlen.hinzufügen(400); System.aus.println("ArrayList vor : " + Zahlen); Iterator<Integer> itr = numbers.iterator(); // remove all even numbers while (itr.hasNext()) { Integer number = itr.next(); if (number % 2 == 0) { numbers.remove(number); } } System.out.println("ArrayList After : " + numbers); }Output :ArrayList Before : Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831) at Testing.main(Testing.java:28)
Sie können ConcurrentModificationException, aufgrund Aufruf remove() -Methode von ArrayList. Dies ist in einfachen Beispielen wie diesem einfach, aber in realen Projekten kann es sehr schwierig sein. Um diese Ausnahme zu beheben, ersetzen Sie einfach call of numbers .entfernen() zu itr.remove(), dadurch wird das aktuelle Objekt entfernt, das Sie iterieren, wie unten gezeigt :
System.aus.println("ArrayList vor : " + Zahlen);Iterator<Ganzzahl> itr = Zahlen.iterator();// Entfernen Sie alle geraden numberswhile (itr.hasNext()) { Ganzzahl = itr.nächsten(); wenn (Zahl % 2 == 0) { itr.entfernen(); }}System.aus.println("ArrayList After : " + numbers);OutputArrayList Before : ArrayList After :
Das ist alles in diesem Beitrag darüber, wie man Objekte aus der ArrayList in Java entfernt. Wir haben zwei Möglichkeiten gelernt, ein Objekt oder Element aus der ArrayList zu entfernen. Übrigens sollten Sie immer remove(index) verwenden, um das Objekt zu löschen, wenn Sie nicht iterieren, andernfalls verwenden Sie immer die remove() -Methode des Iterators, um das Objekt aus der ArrayList zu entfernen. Übrigens funktionieren die obigen Tipps mit jeder indexbasierten Listenimplementierung.
Weiterführende Informationen
Java Vertieft: Werden Sie ein kompletter Java-Ingenieur
Java-Grundlagen: Sammlungen
Datenstrukturen und Algorithmen: Deep Dive mit Java
Algorithmen und Datenstrukturen – Teil 1 und 2
Datenstrukturen in Java 9 von Heinz Kabutz