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

どこに問題があり、どのように問題を解決するかがわかりません

4

1 に答える 1

2

短い答え:

元のリストを保持して、よりグルーヴィーで不変性を高めるには:

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]
于 2013-04-13T14:29:31.610 に答える