我有一个想要迭代的ArrayList。当我迭代它的时候,我必须同时删除元素。显然,这会抛出一个java.util.ConcurrentModificationException
。
处理此问题的最佳实践是什么?我应该先克隆列表吗?
我删除的不是循环本身的元素,而是代码的另一部分。
我的代码如下所示:
public class Test() {
private ArrayList<A> abc = new ArrayList<A>();
public void doStuff() {
for (A a : abc)
a.doSomething();
}
public void removeA(A a) {
abc.remove(a);
}
}
a.doSomething
可能会调用Test.removeA()
;
发布于 2016-08-24 18:19:12
您正在尝试从高级"for loop“中删除列表中的值,这是不可能的,即使您应用了任何技巧(您在代码中就是这样做的)。更好的方法是按照这里的建议编写迭代器级别的代码。
我想知道为什么人们没有建议使用传统的for循环方法。
for( int i = 0; i < lStringList.size(); i++ )
{
String lValue = lStringList.get( i );
if(lValue.equals("_Not_Required"))
{
lStringList.remove(lValue);
i--;
}
}
这也是可行的。
发布于 2017-03-05 18:54:12
在Java8中,您可以使用Collection接口,并通过调用removeIf方法来完成此操作:
yourList.removeIf((A a) -> a.value == 2);
欲获知更多信息,请访问here。
发布于 2017-01-23 07:27:52
您真的应该以传统的方式迭代回数组。
每次从列表中删除一个元素时,后面的元素都会被前移。只要您不更改除迭代元素之外的其他元素,下面的代码就应该可以工作。
public class Test(){
private ArrayList<A> abc = new ArrayList<A>();
public void doStuff(){
for(int i = (abc.size() - 1); i >= 0; i--)
abc.get(i).doSomething();
}
public void removeA(A a){
abc.remove(a);
}
}
https://stackoverflow.com/questions/8104692
复制相似问题