从每个循环的列表中删除一个项,导致java.util.ConcurrentModificationException

时间:2016-04-19 13:29:52

标签: groovy

我有一个foreach循环遍历一个arraylist。

在for循环的主体中,我有一个if条件,它从列表中删除当前项。

for (item in mylist){
    if(some condition is met)
        mylist.remove(mylist.indexOf(item))
}

但是这会导致java.util.ConcurrentModificationException被抛出,在groovy中执行此操作是违法的,如果是这样,我怎么能超越这个?

2 个答案:

答案 0 :(得分:0)

使用迭代器可以轻松地在迭代列表时进行删除。

我在这里提供一个小的(不言自明的)例子:

List<String> foo = new ArrayList<String>();
// fill foo with data
Iterator<String> it = foo.iterator();
while (it.hasNext()) {
    String s = it.next();
    if (s.equals("B"))
        foo.remove("B");
}

答案 1 :(得分:0)

如果你不介意创建一个新的List(而不是修改原始列表),那么一个相当惯用的方法是:

mylist = mylist.findAll{ !some condition is met }

否则,如果您想修改集合,可以使用removeAll / retainAll方法并使用:

mylist.removeAll{ some condition is met }