107

在遍历列表时,我想根据条件删除列表中的一项。请参阅下面的代码。

这给了我一个ConcurrentModification例外。

for (Object a : list) {
    if (a.getXXX().equalsIgnoreCase("AAA")) {
        logger.info("this is AAA........should be removed from the list ");
        list.remove(a);
    }
}

如何才能做到这一点?

4

6 回答 6

228
for (Iterator<String> iter = list.listIterator(); iter.hasNext(); ) {
    String a = iter.next();
    if (...) {
        iter.remove();
    }
}

额外假设列表是字符串。正如已经回答的那样,list.iterator()需要一个。listIterator也可以做一些导航

----------

更新

正如@AyushiJain 评论的那样,有

list.removeIf(...);
于 2013-06-24T15:44:14.003 回答
76

您需要使用Iterator并调用remove()iterator不是使用for循环。

于 2013-06-24T15:42:36.153 回答
33

你不能这样做,因为你已经在循环了。

为了避免这种情况,请使用迭代器,它可以保证您安全地从列表中删除元素......

List<Object> objs;
Iterator<Object> i = objs.iterator();
while (i.hasNext()) {
   Object o = i.next();
  //some condition
    i.remove();
}
于 2013-06-24T15:43:50.720 回答
20

您不能也不应该在迭代列表时修改它。您可以通过暂时保存要删除的对象来解决此问题:

List<Object> toRemove = new ArrayList<Object>();
for(Object a: list){
    if(a.getXXX().equalsIgnoreCase("AAA")){
        toRemove.add(a);
    }
}
list.removeAll(toRemove);
于 2013-06-24T15:43:14.453 回答
7

除了这里提供的所有优秀解决方案之外,我还想提供一个不同的解决方案。

我不确定您是否可以自由添加依赖项,但如果可以,您可以添加https://code.google.com/p/guava-libraries/作为依赖项。这个库增加了对 Java 的许多基本功能操作的支持,并且可以使处理集合变得更加容易和更具可读性。

在代码中,我用 T 替换了 List 的类型,因为我不知道您的列表输入到什么。

这个问题可以用番石榴解决:

List<T> filteredList = new Arraylist<>(filter(list, not(XXX_EQUAL_TO_AAA)));

然后在其他地方将 XXX_EQUAL_TO_AAA 定义为:

public static final Predicate<T> XXX_EQUAL_TO_AAA = new Predicate<T>() {
    @Override
    public boolean apply(T input) {
        return input.getXXX().equalsIgnoreCase("AAA");
    }
}

但是,在您的情况下,这可能是矫枉过正。它只是随着您使用集合的更多而变得越来越强大的东西。

哦,你还需要这些静态导入:

import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Collections2.filter;
于 2013-06-24T16:09:00.480 回答
5
//first find out the removed ones

List removedList = new ArrayList();
for(Object a: list){
    if(a.getXXX().equalsIgnoreCase("AAA")){
        logger.info("this is AAA........should be removed from the list ");
        removedList.add(a);

    }
}

list.removeAll(removedList);
于 2013-06-24T15:42:49.903 回答