我在ArrayList上使用了增強for循環,並希望刪除某些包含特定值的元素。Iteration,Java中的concurrentModifcationException
當我嘗試這樣做時,我得到了上述例外。我看了一下,看起來使用增強的for循環,而修改集合是一個壞主意。我還會怎麼做呢?
感謝您的任何幫助。
我在ArrayList上使用了增強for循環,並希望刪除某些包含特定值的元素。Iteration,Java中的concurrentModifcationException
當我嘗試這樣做時,我得到了上述例外。我看了一下,看起來使用增強的for循環,而修改集合是一個壞主意。我還會怎麼做呢?
感謝您的任何幫助。
您可以保留要刪除的項目列表,然後在循環完成後調用removeAll。
Vector toRemove=new Vector();
for (Object o: array){
if(remove(o)) toRemove.add(o);
}
array.removeAll(o);
此異常可能由已檢測到對象的併發修改方法被拋出時,這種修改是不允許的
你應該得到一個迭代器收集,走的是和調用remove()方法的迭代器當你想刪除一個元素。請注意,並非所有的Iterator實現都支持remove(),這是一個可選的方法!
for(Iterator it = collection.iterator(); it.hasNext();) {
Object element = it.next();
if(.. should remove element ..)
it.remove()
}
請記住,ArrayLists的這種方法可能會很慢,但由於不需要「查找」要移除的項目(例如LinkedList和Sets),因此對於ArrayList可能會稍微快一些。 – deterb 2010-08-04 02:22:24
由於您無權訪問正在使用的Iterator
,因此無法使用增強型for循環執行此操作。您需要使用常規循環並通過Iterator.remove()
刪除ArrayList
的元素。
有兩件事。您應該使用ArrayList而不是Vector(不需要同步Vector提供)。 另外,請注意,對於不同的集合實現,此方法略微更好/更差。 ArrayList就是其中之一,就好像你要刪除一堆物品一樣,它可以在一次操作中重新包裝它們,而不是每次刪除物品(O(n)而不是O(n^2))。 – deterb 2010-08-04 02:25:29