2013-01-06 51 views
2

我有以下代碼:的Java併發修改

System.out.println(dislist.size()); 

for (int k = 0; k < 10; k++) { 
    System.out.println(k + dislist.get(k).first + dislist.get(k).second); 

    if (!dislist.get(k).first.equals(Nodename)) { 
     if (dislist.get(k).first.equals(myfirst) || 
      dislist.get(k).first.equals(mysecond) || 
      dislist.get(k).second.equals(myfirst) || 
      dislist.get(k).second.equals(mysecond)) { 
       dislist.remove(k);      
      } 
     } 
    } 
} 

的問題是:打印在一開始明確表示,dislist.size()是10 不過,我得到一個數組越界異常,告訴我列表的大小不超過6. 是的,我DID添加新的對象列表之前幾行。 我想當循環開始尚未完成。 有沒有辦法強制Java(在同一個方法中)只有當列表中有10個對象時才啓動循環?

+0

如果你寫'if(distlist.size()> 10){'你可能會更開心。 java不是透視。 – bmargulies

+0

你得到ConcurrentModificaiton異常或ArrayOutOfBoundException ...你得到什麼錯誤? – Jayamohan

+0

ArrayOutofBound。 – user1862770

回答

4
Iterator<YourClass> iter = dislist.iterator(); 
while (iter.hasNext()) { 
    YourClass obj = iter.next(); 
    if (/* your expression */) { 
      iter.remove(); 
    } 
} 
5

您正在從列表中刪除元素,因爲您在迭代它。這就是大小在變化的原因。

dislist.remove(k);

創建一個新的列表,並添加你想要刪除它的每個元素。循環完成後,請使用disList.removeAll(listOfElementsToRemove)一次全部刪除它們。

+2

或使用ListIterator。 –

+2

或者只是一個迭代器。 –

+0

當迭代過程中移除元素時,這兩種方式都不會讓你產生'ConcurrentModificationException'嗎? – Mike