[英]Java ArrayList concurrent modification
我遇到了一些問題,無法順利完成此工作:
for(Iterator<Object> i = mylist.iterator(); i.hasNext();) {
Object obj = i.next();
ArrayList<Object> newlist = new ArrayList<Object>();
newlist.add(obj);
i.remove();
for(Iterator<Object> in = mylist.iterator(); in.hasNext();) {
Object next = in.next();
if (obj != next && (another condition)) {
newlist.add(next);
in.remove();
}
}
if (newlist.size() > 2) anotheList.add(newlist);
else for(Object r : newlist) {
//mylist get back object:
mylist.add(r);
}
}
我試圖找到一種優雅的方式來做到這一點,而無需越來越多地復制我的清單...
代碼當前正在執行以下操作:
顯然,這會在外部循環的第二次迭代時發生並發修改,因為內部循環已修改了要在外部循環中迭代的集合。 你不能那樣做。
但是,更重要的是,該算法沒有多大意義。 在我看來,這很可能意味着該代碼沒有按照您的意圖進行操作。 除非你解釋一下你實際上是試圖實現的,我們不能找出真正的問題是什么,以及如何解決它。
我仍然不確定您要達到的目標,但我認為解決方案將涉及以下一項或兩項:
更改實現類的myList
到確實允許並發修改並發集合類之一; 例如ConcurrentLinkedDeque
。
以此替換外部循環:
while (!myList.isEmpty()) { Object obj = myList.remove(0); ... }
如果在第一個內部循環運行時沒有其他修改列表的情況,則后一種補救方法將擺脫ConcurrentModificationException
。 第一種補救措施完全擺脫了ConcurrentModificationException
,但不能保證第一個內部循環將看到在其他位置添加的元素。
在這兩種情況下,如果在處理條目方面都沒有任何進展,則必須擔心如何終止循環。
“大O”復雜度也是一個問題,但是如果不了解“其他條件”在做什么,就無法表征。
我假設您收到一個ConcurrentModificationException。
當第二個迭代器在其上進行迭代時,您將無法在迭代器中修改列表。
http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.