藉此Java代碼:當裏面的foreach刪除,我們需要後退一步
for (ContactsReduced curContact : allcontacts) {
..........
allcontacts.remove(curContact);
}
我根據條件刪除,就會在foreach錯過下一個項目的訂單,我們需要退後一步(不知何故)?
藉此Java代碼:當裏面的foreach刪除,我們需要後退一步
for (ContactsReduced curContact : allcontacts) {
..........
allcontacts.remove(curContact);
}
我根據條件刪除,就會在foreach錯過下一個項目的訂單,我們需要退後一步(不知何故)?
該代碼將與大多數集合斷開 - 除了一些集合(如java.util.concurrent
中的集合)之外,不支持在迭代集合的同時修改集合。
有幾個選項:
iterator()
的集合),而不是增強的for循環,並調用iterator.remove()
刪除項目絕對不建議在迭代時篡改集合。我不確定Java是否允許它;它可能會拋出異常。我知道C#會...
迭代器將失敗,併發出ConcurrentModificationException。這就是收集框架的設計。
List<Integer> al = new ArrayList<Integer>();
for(int i=0;i<10;i++){
al.add(i);
}
for(Integer x:al){
al.remove(x);
System.out.println(al);
}
那麼,這個問題很有趣,所以我在我的系統中試過,這是我得到的。
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at test.Main.main(Main.java:17)
就以迭代看看節上collection interface tutorial
使用iterator而不是換每次當你需要刪除當前元素構造。 for-each構造隱藏迭代器,所以你不能調用remove。因此,for-each構造不適用於過濾。
注意Iterator.remove是在迭代
這可能是值得一提的是這個「功能」被稱爲快速失敗的唯一安全的方法來修改的集合。閱讀相關的Javadoc時,它應該有助於瀏覽。 – mindas 2010-05-17 08:36:59