2010-10-22 14 views
6

Sono un programmatore Java relativamente nuovo e sto avendo difficoltà a rimuovere più di un elemento da un ArrayList. Idealmente mi piacerebbe fare qualcosa di simile:Come rimuovere elementi sequenziali da un ArrayList Java?

ArrayList ar1 = new ArrayList(); 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 

for (int i = 0; i < 2; i++){ 
    ar1.remove(i); 
} 

Penso iteratore potrebbe aiutare, ma non riesco a trovare un esempio che corrisponde abbastanza vicino a quello che sto cercando di fare. Qualsiasi aiuto sarebbe apprezzato. Grazie.

risposta

20

Ecco cosa si vuole fare:

ar1.subList(0, 2).clear(); 

Questo crea una vista sottolista dei primi 2 elementi della lista e poi si schiarisce che sottolista, rimuovendoli dalla lista originale. Il metodo subList esiste principalmente per questo genere di cose ...fare operazioni su un intervallo specifico della lista.

+0

+1 eccellente risposta. – aioobe

+0

+1 È ciò che i documenti API suggeriscono di fare. (Potrebbe non essere comunemente efficiente come più chiamate 'rimuovi'). –

+0

A meno che le voci che l'OP vuole rimuovere non siano sequenziali. Dipende dai dettagli –

2

È possibile utilizzare Collection.removeAll (toRemove) se si dispone di un elenco separato di oggetti da rimuovere.

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Se la vostra collezione si basa indicizzato, come ArrayList è, è possibile chiamare

remove(index) 

per rimuovere l'elemento in corrispondenza dell'indice. Puoi farlo in un ciclo, ma attenzione che la rimozione sposta tutti gli indici come indicato da un'altra risposta.

Se tutto quello che vogliamo fare è rimuovere i primi due elementi dalla lista, quindi

list.remove(0); 
    list.remove(0); 

dovrebbe farlo.

+0

mio errore ho letto troppo veloce e ho pensato che stava cercando di impedire elementi duplicati. removeAll è ancora sopra kill in questo scenario – Woot4Moo

+0

Ma 'removeAll' rimuoverà ** tutte le occorrenze ** degli elementi contenuti nell'argomento, dal callee, cioè, non è la stessa cosa che rimuovere il primo dagli elementi di ArrayList . – aioobe

+0

@aioobe hai ragione. – hvgotcodes

5

Si può certamente fare che

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    for (int i = 0; i < 2; i++) { 
     ar1.remove(i); 
    } 
    System.out.println(ar1); 

solo prestare attenzione che dopo aver rimosso primo elemento, altri elementi si spostano. Pertanto, chiamando

ar1.remove(0); 
ar1.remove(1); 

rimuoverà efficacemente il primo e il terzo elemento dall'elenco. Questo eliminerà primi due elementi, però:

ar1.remove(0); 
ar1.remove(0); 
+0

In che modo questo dipende dal tipo di cosa memorizzata nella lista? –

+0

@Stephen Il mio male, ho confuso le cose. –

3

Per traslochi indicizzati da un elenco, è necessario contare all'indietro:

for (int i = 1; i >= 0; i--) 

in caso contrario, il tuo primo ritiro sposta le voci "sopra" nel raccolta e non finisci per rimuovere gli oggetti che pensi di rimuovere.

1

Si potrebbe provare questo:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
int i = 0; 
while (i < 2 && it.hasNext()) { 
    it.next(); 
    it.remove(); 
    i++; 
} 

Oppure, più in generale:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
while (it.hasNext()) { 
    Whatever next = it.next(); 
    if (shouldRemove(next)) { 
     it.remove(); 
    } 
} 

EDIT: Immagino che dipende se si sta cercando di rimuovere determinati indici o oggetti particolari. Dipende anche da quanta logica è necessario decidere se qualcosa deve essere rimosso. Se conosci gli indici, rimuovili in ordine inverso. Se hai un set di oggetti da rimuovere, usa removeAll. Se si desidera scorrere l'elenco e rimuovere gli oggetti corrispondenti a un predicato, utilizzare il codice riportato sopra.

+1

Ah, si. Grazie, Erick. StackOverflow ha davvero bisogno di un compilatore integrato nel riquadro delle risposte in modo da poter testare il nostro codice :) –

2

Se conoscete gli indici degli elementi che si desidera rimuovere, è possibile rimuoverli in ordine inverso, senza preoccuparsi di indici di spostamento:

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    int[] indexesToRemove = {0,2,3}; 
    Arrays.sort(indexesToRemove); 
    for (int i=indexesToRemove.length-1; i>=0; i--) { 
     ar1.remove(indexesToRemove[i]); 
    } 
Problemi correlati