2012-01-10 9 views
13

反復中にコレクションのアイテムを削除するGroovyの方法はありますか? Javaでは、これはIterator.remove()用いて達成される:Groovyは反復中にコレクションアイテムを削除します

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

んGroovyは削除-しばらくは、反復その言語の構文で提供、または私はIterator.remove()を使用しない持っていますか?

答えて

23

Use removeAll()

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

"繰り返しながら"、あなたは/オブジェクトごとに何かをしようとしていますか? removeAllまだ限り、(以前のように)閉鎖の最後の文はまだtruthy/falseyであるように動作します:クロージャの戻り値(最後の文の値、または明示的なreturn値)truthy/falseyある

> 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] 

それは、除去すべきものを決定するために使用されます。各オブジェクトに明示的に参照する必要はありません。

+2

非常にクール!!! .removeAll {} –

+1

@JarredOlsonもしあなたがGroovyを使い慣れていないなら、手動反復子ベースのループ(またはfor() 'forループ)をするのをやめてください。 'each'、' collect'、 'findAll'などのクロージャーに基づくメソッドでは、Groovyで明示的なイテレーターを使用する必要はありませんでした。それは大きな救済策でした= D – epidemian

+0

@epidemian私は新しいものではなく、 .removeAll {}について知りませんでした。私はちょうどそれがクールだと思っていました。私はあなたのステートメントをエコーし​​ますが、Collectionのメソッドを使うことはclosure/Groovyに慣れるための非常に良い方法です。 –

関連する問題