2010-10-28 9 views
17

Sto cercando di capire come rimuovere un elemento da un elenco in groovy da un loop.Come faccio a scorrere un elenco e rimuovere un elemento in Groovy?

static main(args) { 
    def list1 = [1, 2, 3, 4] 
    for(num in list1){ 
    if(num == 2) 
     list1.remove(num) 
    } 
    println(list1) 
} 
+0

Giusto per chiarire. So che non ho bisogno del ciclo, ma questo dimostra quello che sto cercando di fare senza mettere un po 'di logica in più nell'esempio. – ScArcher2

risposta

12

Se si desidera rimuovere l'elemento con indice 2, si può fare

list = [1,2,3,4] 
list.remove(2) 
assert list == [1,2,4] 

// or with a loop 
list = [1,2,3,4] 
i = list.iterator() 
2.times { 
    i.next() 
} 
i.remove() 
assert list == [1,2,4] 

Se si desidera rimuovere il (primo) elemento con valore 2, si può fare

list = [1,2,3,4] 
list.remove(list.indexOf(2)) 
assert list == [1,3,4] 

// or with a loop 
list = [1,2,3,4] 
i = list.iterator() 
while (i.hasNext()) { 
    if (i.next() == 2) { 
     i.remove() 
     break 
    } 
} 
assert list == [1,3,4] 
+0

in realtà, questo non funziona davvero. 'i = my.object.here.iterator()' semplicemente non funziona – Sliq

+0

Funziona con gli elenchi. Dovrebbe funzionare con qualsiasi oggetto che implementa l'interfaccia 'Iterable' o ha un metodo' iterator() '. – ataylor

4

Penso che si possa fare:

list - 2; 

o ...

list.remove(2) 

Non c'è circuito necessari.

Se si desidera utilizzare un ciclo, suppongo che si possa utilizzare l'iteratore per rimuovere effettivamente l'elemento.

import java.util.Iterator; 

static main(args) { def list1 = [1, 2, 3, 4] 
    Iterator i = list1.iterator(); 
    while (i.hasNext()) { 
     n = i.next(); 
     if (n == 2) i.remove(); 
    } 
    println(list1) 
}​ 

ma non vedo perché vorresti farlo in quel modo.

+0

L'esempio è stato pensato per essere solo un esempio di alcune situazioni del mondo reale. Ho finito per usare l'iteratore per fare la rimozione e ha funzionato alla grande. Grazie! – ScArcher2

17
list = [1, 2, 3, 4] 
newList = list.findAll { it != 2 } 

dovrebbe darvi tutti, ma il 2

Naturalmente si può avere un motivo per richiedere il ciclo?

+0

Ciò non spiega la ConcurrentModificationException di Java che l'OP (poster originale) aveva ricevuto (la soluzione più probabile su tale questione sarebbe quella di usare un CopyOnWriteArrayList nel mondo Java), ma, ai miei occhi, questo è il modo più pratico in Groovy. - Per favore, può, inoltre, tutti notano che il metodo List.remove (int) differisce dal metodo List.remove ((Object) int). – robbbert

+0

In groovy chiama rimuovi per indice quando si ha una lista di numeri interi. – ScArcher2

6

Come si afferma nel commento che non si richiede specificamente un ciclo .... Se si è felici di modificare l'elenco originale è possibile utilizzare removeAll:

// Remove all negative numbers 
list = [1, 2, -4, 8] 
list.removeAll { it < 0 } 
Problemi correlati