从java中删除列表中的项目

在循环列表时,我想根据如下条件删除一个列表项

这是给我concurrentModificationexception

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

这应该如何处理

你需要使用Iterator并且在iterator上调用remove()而不是使用for循环。

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

进一步假设列表是string。 如已经回答的那样,需要一个list.iterator()listIterator也可以做一些导航。

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

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

 List<Object> objs; Iterator<Object> i = objs.iterator(); while (i.hasNext()) { Object o = i.next(); //some condition i.remove(); } 

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

 List<Object> toRemove = new ArrayList<Object>(); for(Object a: list){ if(a.getXXX().equalsIgnoreCase("AAA")){ toRemove.add(a); } } list.removeAll(toRemove); 

除了在这里提供的所有优秀的解决scheme,我想提供一个不同的解决scheme。

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

在代码中,我用Treplace了List的types,因为我不知道你的列表input到了什么地方。

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

 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"); } } 

但是,这可能是你的情况矫枉过正。 这只是越来越强大的东西越多,你与collections工作。

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

 import static com.google.common.base.Predicates.not; import static com.google.common.collect.Collections2.filter; 
 //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);