我有以下代码引发ConcurrentModificationException。
有人可以解释为什么会这样吗?
public void foo(ArrayList<Bet> bets)
Iterator it1 = bets.iterator();
while(it1.hasNext())
Bet b1 = (Bet) bets.next()
Iterator it2 = bets.iterator();
while(it2.hasNext())
if(bet1.equals(bet2))
it2.remove();
it1.remove(); //ConcurrentModificationException thrown here
我是否只能为每个iterator.next()调用一次调用iterator.remove(),
并且在下一次调用iterator.next()之前,调用两次被删除导致了此情况?
任何帮助将非常感谢。
最佳答案
您需要将所有删除内容收集到Set
中,并在所有迭代完成后将其删除。
public void foo(ArrayList<Bet> bets) {
Set<Bet> remove = new HashSet<Bet>();
for ( Bet bet1 : bets ) {
for ( Bet bet2 : bets ) {
// Not the same but equal.
if ( bet1 != bet2 && bet1.equals(bet2)) {
remove.add(bet1);
remove.add(bet2);
}
}
}
bets.removeAll(remove);
}