Esistono due modi per rimuovere oggetti da ArrayList in Java, in primo luogo, utilizzando il metodo remove() e in secondo luogo utilizzando Iterator. ArrayList fornisce il metodo overload remove (), un indice accept dell’oggetto da rimuovere, ovvero remove(int index) e un altro oggetto accept da rimuovere, ovvero remove(obj Object). Regola empirica è, Se si conosce l’indice dell’oggetto, quindi utilizzare il primo metodo, altrimenti utilizzare il secondo metodo. A proposito, devi ricordarti di usare i metodi di rimozione ArrayList, solo quando non stai iterando su ArrayList se stai iterando, usa Iterator.remove () metodo, non riuscendo a farlo può provocare ConcurrentModificationException in Java. Un altro gotcha può essersi verificato a causa di autoboxing. Se si guarda da vicino che due metodi di rimozione, remove (int index) e remove(Object obj) sono indistinguibili se si sta tentando di rimuovere da un ArrayList di interi.
Supponiamo di avere tre oggetti in ArrayList cioè e si desidera rimuovere il secondo oggetto, che è 2. È possibile chiamare remove(2), che in realtà è una chiamata a remove(Object) se si considera l’autoboxing, ma verrà interpretata come una chiamata a remove 3rd element, interpretando come remove(index).
Ho discusso questo problema in precedenza nel mio articolo sulle migliori pratiche da seguire durante il sovraccarico dei metodi in Java. A causa della regola di allargamento meno nota e dell’autoboxing, il metodo mal sovraccaricato può creare molta ambiguità.
Esempio di codice Per rimuovere elementi da ArrayList
Proviamo sopra la teoria con un semplice esempio di codice di ArrayList con numeri interi. Il seguente programma ha un ArrayList di interi contenenti 1, 2 e 3 cioè, questo corrisponde esattamente all’indice.
test del pacchetto;importa java.util.ArrayList; importa java.util.Lista;/** * * @author http://java67.blogspot.com */public class JavaTutorial{ /** * @param args gli argomenti della linea di comando */ public static void main(String args) { List<Integer> numeri = new ArrayList<Integer>(); i numeri.aggiungi (1); numeri.aggiungi (2); numeri.aggiungere (3); Sistema.fuori.println ("ArrayList contiene:" + numeri); / / Chiamando rimuovere (indice) numeri.remove (1); //rimozione dell'oggetto all'indice 1 cioè 2 ° Oggetto, che è 2 / / Chiamata remove(object) numbers.remove (3);}} Output: ArrayList contiene: Eccezione nel thread" principale " java.lang.IndexOutOfBoundsException: Indice: 3, Dimensione: 2 su java.util.ArrayList.Controllo di gamma (ArrayList.java: 635) a java.util.ArrayList.rimuovere (ArrayList.java: 474) al test.Test.principale (Test.java: 33) Risultato Java: 1
Puoi vedere che anche la seconda chiamata viene trattata come remove(index). Il modo migliore per rimuovere l’ambiguità è eliminare l’autoboxing e fornire un oggetto reale, come mostrato di seguito.
Sistema.fuori.println ("ArrayList Prima :" + numeri); / / Chiamando rimuovere (indice)numeri.remove (1); //rimozione dell'oggetto all'indice 1 cioè 2 ° Oggetto, che è 2 / / Chiamata remove(object) numbers.rimuovere (nuovo intero(3)); Sistema.fuori.println ("ArrayList After:" + numbers);Output :ArrayList Before : ArrayList After :
Questa volta, funziona, ma ho paura degli sviluppatori pigri come me, che prendono l’autoboxing concesso. Ora diamo un’occhiata a rimuovere l’oggetto da ArrayList mentre iteriamo su di loro. È necessario avere familiarità con Iterator in Java, prima di procedere ulteriormente.
Rimuovere l’Oggetto Dal ArrayList utilizzando Iterator
Questo è in realtà un sottile dettaglio della programmazione Java, non è ovvio per i primi temporizzatori, come il compilatore non si lamentano, anche se si utilizza il metodo remove() di java.util.ArrayList, mentre si utilizza Iteratore. Realizzerai solo il tuo errore, quando vedi ConcurrentModificationException, che di per sé è fuorviante e potresti passare ore e ore a trovare un altro thread, che sta modificando ArrayList, a causa di Concurrent word. Vediamo un esempio.
public static void main(String args) { List<Integer> numeri = new ArrayList<Integer>(); i numeri.aggiungi (101); numeri.aggiungi (200); numeri.aggiungi (301); numeri.aggiungi (400); Sistema.fuori.println ("ArrayList prima :" + numeri); 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)
È possibile ConcurrentModificationException, a causa della chiamata al metodo remove () da ArrayList. Questo è facile in semplici esempi come questo, ma nel progetto reale, può essere davvero difficile. Ora, per risolvere questa eccezione, basta sostituire la chiamata di numeri.rimuovere () a itr.remove (), questo rimuoverà l’oggetto corrente che stai iterando, come mostrato di seguito:
System.fuori.println ("ArrayList Prima :" + numeri); Iteratore < Integer> itr = numeri.iterator ();// rimuovi tutti i numeri pari mentre (itr.hasNext ()) { Numero intero = itr.prossimo(); se (numero % 2 = = 0) { itr.remove ();}} Sistema.fuori.println ("ArrayList After:" + numbers); OutputArrayList Before : ArrayList After :
Questo è tutto su questo post su Come rimuovere l’oggetto da ArrayList in Java. Abbiamo imparato due modi per rimuovere un oggetto o un elemento da ArrayList. A proposito, dovresti sempre usare remove (index) per eliminare l’oggetto, se non stai iterando, altrimenti usa sempre il metodo remove () di Iterator per rimuovere l’oggetto da ArrayList. A proposito, i suggerimenti di cui sopra funzioneranno con qualsiasi implementazione di elenchi basati su indici.
Ulteriore apprendimento
Java in profondità: Diventa un ingegnere Java completo
Java Fundamentals: Collections
Strutture dati e algoritmi: Deep Dive Using Java
Algoritmi e strutture dati-Parte 1 e 2
Strutture dati in Java 9 di Heinz Kabutz