短い答え:
元のリストを保持して、よりグルーヴィーで不変性を高めるには:
def removed = clc - subclc
assert removed == [[16, 61, 85, 96], [23, 54, 65, 95], [16, 29, 83, 94], [0, 31, 42, 93], [33, 40, 51, 56, 61, 62, 64, 89, 92], [0, 63, 84, 90, 91]]
そして、元のリストを変更するJavaの方法:
clc.removeAll subclc
assert clc == [[16, 61, 85, 96], [23, 54, 65, 95], [16, 29, 83, 94], [0, 31, 42, 93], [33, 40, 51, 56, 61, 62, 64, 89, 92], [0, 63, 84, 90, 91]]
長い答え:
リストIterator
を変更しながらリストを調べています。この場合Iterator.remove()
、 foreach ループによって抽象化されている を使用することをお勧めします。foreach ループを使用してリストを変更すると、 を使用した変更の反復子チェックに遭遇しますcheckForComodification()
。イテレータを明示的に取得すると、次のように機能します。
list1 = [10,20,30,40,50,60,70,80,90]
list2 = [50,60,80]
def iter = list1.iterator()
while (iter.hasNext()) {
def item = iter.next()
if (list2.contains(item)) iter.remove()
}
assert list1 == [10,20,30,40,70,90]
または、インデックスを使用できます。インデックスを制御する必要があることに注意してください。
list1 = [10,20,30,40,50,60,70,80,90]
list2 = [50,60,80]
for (int i = 0; i < list1.size(); i++) {
def item = list1[i]
if (list2.contains(item)) { list1.remove i-- }
}
assert list1 == [10,20,30,40,70,90]