2012-01-10 14 views
13

Czy istnieje sposób Groovy usuwania elementu kolekcji podczas iteracji? W Javie jest to realizowane za pomocą Iterator.remove():Groovy usuwa element kolekcji podczas iterowania

Collection collection = ... 
for (Iterator it=collection.iterator(); it.hasNext();) { 
    Object obj = it.next(); 
    if (should remove) { 
     it.remove(); 
    } 
} 

Czy Groovy zapewnić remove-while-iteracji w składni języka, czy muszę używać Iterator.remove()?

Odpowiedz

23

Use removeAll().

> c = [1, 2, 3, 4, 5] 
> c.removeAll { it % 2 == 0 } 
> println c 
[1, 3, 5] 

Pytasz konkretnie o "podczas iteracji", czy próbujesz zrobić coś z/za każdym obiektem? removeAll nadal działa tak długo, jak ostatnie stwierdzenie zamknięcia jest nadal truthy/falsey (jak poprzednio):

> c.removeAll { 
*  tmp = it * 10 
*  println "ohai ${it}*10=${tmp}" 
*  tmp >= 40 
* } 
ohai 1*10=10 
ohai 2*20=20 
ohai 3*30=30 
ohai 4*40=40 
ohai 5*50=50 
> println c 
[1, 2, 3] 

zwracana wartość zamknięcia za (wartość ostatniego oświadczenia lub wyraźnej wartości return) jest truthy/falsey, to zostanie użyty do ustalenia, co należy usunąć. Nie musi odnosić się bezpośrednio do każdego obiektu.

+2

Bardzo fajnie !!! Nie wiedziałem o .removeAll {} –

+1

@JarredOlson Jeśli jesteś nowy w Groovy, sugeruję powstrzymanie się od wykonywania pętli opartych na iteratorach (lub 'for ()' for loops). Z metodami opartymi na zamknięciu, takimi jak 'each',' collect', 'findAll', itp. Nigdy nie miałem potrzeby używać explicite iteratorów w Groovy, i to była wielka ulga = D – epidemian

+0

@epidemian Nie jestem nowy, po prostu nie wiedziałem o .removeAll {} i po prostu pomyślałem, że to było fajne :) Chciałbym powtórzyć twoje stwierdzenia, chociaż używając metod z kolekcji to bardzo dobre sposoby na poznanie zamknięć/Groovy. –

Powiązane problemy