2013-01-06 50 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