Короткие ответы:
Для получения дополнительной groovyness и неизменности, сохраняющие первоначальный список:
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]]
И ява путь , изменив первоначальный список:
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]
Мне действительно не нравится манипуляция индексами внутри цикла 'for'. Это то, что 'время' для –