kétféle módon lehet eltávolítani az objektumokat az ArrayList-ből a Java-ban, először az remove() metódus használatával, másodszor pedig az Iterátor használatával. ArrayList biztosít túlterhelt remove () módszer, egy accept index az objektum el kell távolítani, azaz eltávolítani(int index), és más accept objektum el kell távolítani, azaz eltávolítani (objektum obj). Ökölszabály: ha ismeri az objektum indexét, akkor használja az első módszert, különben használja a második módszert. By the way, meg kell emlékezni, hogy használja ArrayList eltávolítás módszerek, csak akkor, ha nem iteráló felett ArrayList ha iteráló akkor használja Iterátor.remove () metódus, ennek elmulasztása a ConcurrentModificationException-t eredményezheti Java-ban. Egy másik gotcha is történt miatt autoboxing. Ha alaposan megvizsgálja, hogy két eltávolítási módszer, az Eltávolítás(int index) és az Eltávolítás (obj objektum) nem különböztethető meg, ha egész számok Tömblistájából próbál eltávolítani.
tegyük fel, hogy három objektum van az ArrayList-ben, azaz el szeretné távolítani a második objektumot, ami 2. Hívhatja eltávolítás(2), amely valójában egy hívás az eltávolításhoz(objektum), ha figyelembe vesszük az autoboxot, de a 3.elem eltávolítására irányuló hívásként értelmezhető, az Eltávolítás(index) értelmezésével.
már tárgyalt ez a probléma korábban az én cikket a legjobb gyakorlatokat követni, míg túlterhelés módszerek Java. A kevésbé ismert szélesítési szabály és az autoboxolás miatt a rosszul túlterhelt módszer sok kétértelműséget okozhat.
Kód példa az elemek eltávolítására az Arraylistből
teszteljük a fenti elméletet egy egyszerű kód példával az ArrayList egész számokkal. Következő program egy ArrayList egész számok tartalmazó 1 , 2 és 3 azaz, ez pontosan megfelel az index.
csomag teszt;import java.util.ArrayList; Java importálása.util.List;/** * * @author http://java67.blogspot.com */public class JavaTutorial{ /** * @param args a parancssori argumentumok */ public static void main(String args) { List<Integer> numbers = new ArrayList<integer>(); számok.Hozzáadás(1); számok.Hozzáadás(2); számok.Hozzáadás(3); Rendszer.kifelé.println ("ArrayList tartalmazza:" + számok); // hívás eltávolítás (index) számok.eltávolítás (1); //objektum eltávolítása az 1.Indexnél, azaz 2. objektum, amely 2 //hívás eltávolítás(objektum) számok.remove (3);}} kimenet:ArrayList tartalmazza : kivétel a "main" java szálban.lang.IndexOutOfBoundsException: Index: 3, Méret: 2 a java-nál.util.ArrayList.rangeCheck (ArrayList.java:635) a java-nál.util.ArrayList.eltávolítás (ArrayList.java:474) a teszt.Teszt.fő (teszt.java: 33) Java eredmény: 1
láthatjuk, hogy a második hívás is kezelik eltávolítás(index). A legjobb módja annak, hogy távolítsa el a kétértelműség, hogy vegye ki AutoBOX, és egy tényleges objektum, az alábbiak szerint.
rendszer.kifelé.println ("ArrayList előtt:" + számok);// hívás eltávolítás (index)számok.eltávolítás (1); //objektum eltávolítása az 1.Indexnél, azaz 2. objektum, amely 2 //hívás eltávolítás(objektum) számok.eltávolítás (Új egész szám(3)); Rendszer.kifelé.println ("ArrayList után:" + számok); kimenet: ArrayList előtt: ArrayList után:
ezúttal működik, de félek a lusta fejlesztők, mint én, amely úgy AutoBOX megadott. Most vessünk egy pillantást az objektum eltávolítására az ArrayList – ből, miközben iterálunk rajtuk. Mielőtt tovább folytatná, ismernie kell az Iterátort a Java-ban.
objektum eltávolítása az ArrayList – ből az Iterátor használatával
ez valójában a Java programozás finom részlete, nem nyilvánvaló az első időzítők számára, mivel a fordító nem panaszkodik, még akkor sem, ha a remove() módszert használja a java-ból.util.ArrayList, Iterátor használata közben. Csak akkor fogod felismerni a hibádat, ha látod a ConcurrentModificationException-t, ami maga is félrevezető, és számtalan órát tölthetsz egy másik szál keresésével, amely módosítja az ArrayList-t, az egyidejű szó miatt. Lássunk egy példát.
nyilvános statikus Void main(String args) { List<egész> numbers = új ArrayList<egész>(); számok.Hozzáadás(101); számok.Hozzáadás(200); számok.Hozzáadás(301); számok.Hozzáadás(400); rendszer.kifelé.println ("ArrayList előtt:" + számok); 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)
akkor ConcurrentModificationException, miatt hívás eltávolítani () metódus ArrayList. Ez egyszerű az ilyen egyszerű példákban, de a real project-ben, nagyon nehéz lehet. Most, hogy kijavítsuk ezt a kivételt, csak cserélje ki a számok hívását.remove() az itr-hez.remove (), ez eltávolítja az iteráló aktuális objektumot, az alábbiak szerint :
rendszer.kifelé.println ("ArrayList előtt:" + számok); Iterátor<egész> itr = számok.iterátor ();// távolítsa el az összes páros számot (itr.hasNext ()) { egész szám = itr.következő(); if (%2 == 0 szám) { ITR.remove(); }}rendszer.kifelé.println ("ArrayList után:" + számok); OutputArrayList előtt: ArrayList után:
Ez minden ezen a poszton arról, hogyan lehet eltávolítani az objektumot ArrayList Java. Két módszert tanultunk meg egy objektum vagy elem eltávolítására az ArrayList – ből. Egyébként mindig használja eltávolítás(index) az objektum törléséhez, ha nem iterál, különben mindig használja az Iterátor remove() módszerét az objektum eltávolítására az Arraylistből. By the way fenti tippek fog működni minden index alapú lista végrehajtását.
További tanulás
Java mélyreható: Legyen egy teljes Java mérnök
Java alapjai: gyűjtemények
adatstruktúrák és algoritmusok: mély merülés Java segítségével
algoritmusok és adatstruktúrák – 1. rész és 2
adatstruktúrák Java 9 Heinz Kabutz