2010-07-20 58 views
1

我在ArrayList上使用了增強for循環,並希望刪除某些包含特定值的元素。Iteration,Java中的concurrentModifcationException

當我嘗試這樣做時,我得到了上述例外。我看了一下,看起來使用增強的for循環,而修改集合是一個壞主意。我還會怎麼做呢?

感謝您的任何幫助。

回答

4

您可以保留要刪除的項目列表,然後在循環完成後調用removeAll。

Vector toRemove=new Vector(); 
for (Object o: array){ 
    if(remove(o)) toRemove.add(o); 
} 
array.removeAll(o); 
+1

有兩件事。您應該使用ArrayList而不是Vector(不需要同步Vector提供)。 另外,請注意,對於不同的集合實現,此方法略微更好/更差。 ArrayList就是其中之一,就好像你要刪除一堆物品一樣,它可以在一次操作中重新包裝它們,而不是每次刪除物品(O(n)而不是O(n^2))。 – deterb 2010-08-04 02:25:29

0

此異常可能由已檢測到對象的併發修改方法被拋出時,這種修改是不允許的

3

你應該得到一個迭代器收集,走的是和調用remove()方法的迭代器當你想刪除一個元素。請注意,並非所有的Iterator實現都支持remove(),這是一個可選的方法!

for(Iterator it = collection.iterator(); it.hasNext();) { 
    Object element = it.next(); 
    if(.. should remove element ..) 
    it.remove() 
} 
+0

請記住,ArrayLists的這種方法可能會很慢,但由於不需要「查找」要移除的項目(例如LinkedList和Sets),因此對於ArrayList可能會稍微快一些。 – deterb 2010-08-04 02:22:24

1

由於您無權訪問正在使用的Iterator,因此無法使用增強型for循環執行此操作。您需要使用常規循環並通過Iterator.remove()刪除ArrayList的元素。