există două moduri de a elimina obiecte din ArrayList în Java, în primul rând, prin utilizarea remove() metodă, și în al doilea rând prin utilizarea Iterator. ArrayList oferă supraîncărcat remove () metodă, o accepta index al obiectului care urmează să fie eliminate adică remove(int index), și alte accepta obiect care urmează să fie eliminate, adică remove(Object obj). Regula generală este că, dacă cunoașteți indexul obiectului, utilizați prima metodă, altfel utilizați a doua metodă. Apropo, trebuie să vă amintiți să utilizați metode de eliminare ArrayList, numai atunci când nu sunt iterarea peste ArrayList dacă sunt iterarea apoi utilizați Iterator.remove () metoda, nu reușesc să facă acest lucru poate duce la ConcurrentModificationException în Java. Un alt gotcha poate avea loc din cauza autoboxing. Dacă vă uitați atent că două metode de eliminare, eliminare (index int) și Eliminare(obiect obj) nu pot fi distinse dacă încercați să eliminați dintr-o listă de numere întregi.
Să presupunem că aveți trei obiecte în ArrayList adică și doriți să eliminați al doilea obiect, care este 2. Puteți apela elimina (2), Care este de fapt un apel pentru a elimina(obiect) dacă ia în considerare autoboxing, dar va fi interpretat ca un apel pentru a elimina elementul 3rd, prin interpretarea ca elimina(index).
am discutat această problemă mai devreme în articolul meu despre cele mai bune practici de urmat în timp ce supraîncărcarea metode în Java. Din cauza mai puțin cunoscute regula lărgirea și autoboxing, slab supraîncărcat metoda poate crea o mulțime de ambiguitate.
exemplu de cod pentru a elimina elementele din ArrayList
să testăm teoria de mai sus cu un exemplu de cod simplu de ArrayList cu numere întregi. Următorul program are o listă de numere întregi care conțin 1 , 2 și 3, adică aceasta corespunde exact indexului.
test de pachete;import java.util.ArrayList;import java.util.Listă;/** * * @autor http://java67.blogspot.com */public class JavaTutorial{ /** * @param args argumentele din linia de comandă */ public static void main(string args) { List<Integer> numbers = New ArrayList<integer>(); numere.adăugați (1); Numere.adăuga(2); numere.adăuga(3); Sistem.afară.println ("ArrayList conține:" + numere); // apelarea numerelor de eliminare (index).eliminați(1); //eliminarea obiectului la indexul 1 adică Al 2-lea obiect, care este 2 //apelarea numerelor de Eliminare (obiect).elimina(3); }}ieșire:ArrayList conține : excepție în fir "principal" java.lang.IndexOutOfBoundsException: Index: 3, Dimensiune: 2 la java.util.ArrayList.rangeCheck (ArrayList.java: 635) la java.util.ArrayList.elimina (ArrayList.java: 474) la încercare.Test.principal(Test.java: 33) rezultat Java: 1
puteți vedea că al doilea apel este, de asemenea, tratat ca eliminare(index). Cel mai bun mod de a elimina ambiguitatea este să scoateți autoboxingul și să furnizați un obiect real, așa cum se arată mai jos.
sistem.afară.println ("ArrayList înainte:" + numere);// apelarea numerelor de eliminare (index).eliminați(1); //eliminarea obiectului la indexul 1 adică Al 2-lea obiect, care este 2 //apelarea numerelor de Eliminare (obiect).eliminare (număr întreg nou (3)); Sistem.afară.println ("ArrayList după:" + numere); ieșire :ArrayList înainte : ArrayList după :
De data aceasta, funcționează, dar mi-e teamă de dezvoltatori leneși ca mine, care ia autoboxing acordat. Acum să aruncăm o privire la eliminarea obiectului din ArrayList în timp ce iterăm peste ele. Trebuie să fiți familiarizați cu Iterator în Java, înainte de a continua mai departe.
Remove Object From ArrayList using Iterator
acesta este de fapt un detaliu subtil al programării Java, care nu este evident pentru primele cronometre, deoarece compilatorul nu se va plânge, chiar dacă utilizați metoda remove() din java.util.ArrayList, în timp ce utilizați Iterator. Veți realiza doar greșeala dvs., atunci când vedeți ConcurrentModificationException, care în sine este înșelătoare și puteți petrece nenumărate ore găsind un alt fir, care modifică acea ArrayList, din cauza cuvântului concurent. Să vedem un exemplu.
public static void main(string args) { List<Integer> numbers = New ArrayList<Integer>(); numere.adăuga(101); numere.adăuga(200); numere.adăuga(301); numere.adăuga(400); sistem.afară.println ("ArrayList înainte de:" + numere); 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)
puteți ConcurrentModificationException, din cauza apel pentru a elimina () metoda de ArrayList. Acest lucru este ușor în exemple simple, cum ar fi acest lucru, dar în proiect real, poate fi foarte greu. Acum, pentru a remedia această excepție, înlocuiți doar apelul numerelor.eliminați () la itr.remove (), acest lucru va elimina obiectul curent pe care îl iterați, așa cum se arată mai jos :
sistem.afară.println ("ArrayList înainte de:" + numere); Iterator<Integer> itr = numere.iterator (); / / elimina toate chiar numberswhile (itr.hasNext ()) {număr întreg = itr.înainte(); dacă (numărul % 2 = = 0) {itr.eliminare ();}} sistem.afară.println ("ArrayList After:" + numbers); OutputArrayList înainte : ArrayList After :
asta e tot pe acest post despre cum să eliminați obiectul din ArrayList în Java. Am învățat două moduri de a elimina un obiect sau element din ArrayList. Apropo, ar trebui să utilizați întotdeauna remove(index) pentru a șterge obiectul, dacă nu iterați, altfel utilizați întotdeauna metoda remove() a Iteratorului pentru eliminarea obiectului din ArrayList. Prin modul de mai sus sfaturi va lucra cu orice implementare listă bazată pe index.
învățarea ulterioară
Java în profunzime: Devino un inginer Java complet fundamentele Java: colecții structuri de date și algoritmi: scufundare profundă folosind Java algoritmi și structuri de date-Partea 1 și 2 structuri de date în Java 9 de Heinz Kabutz