从java中删除列表中的项目
在循环列表时,我想根据如下条件删除一个列表项
这是给我concurrentModification
exception
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);