2013-04-13 2 views
1

У меня есть список:заводного удаление Подсписка

def clc = [[1, 15, 30, 42, 48, 100], [58, 99], [16, 61, 85, 96, 98], [2, 63, 84, 90, 91, 97], [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]] 

и подсписок

def subclc = [[1, 15, 30, 42, 48, 100], [58, 99], [16, 61, 85, 96, 98], [2, 63, 84, 90, 91, 97]] 

Мне нужно удалить подсписок из исходного списка Я делаю так:

subclc.each{ 
    clc.remove(it) 
} 

но выдает исключение Exception in thread "main" java.util.ConcurrentModificationException

Я не понимаю, где проблема и как решить проблему

ответ

2

Короткие ответы:

Для получения дополнительной 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] 
+0

Мне действительно не нравится манипуляция индексами внутри цикла 'for'. Это то, что 'время' для –

Смежные вопросы