2010-05-11 62 views
1

这是我的代码:[Java] Queue in while循环中,无法修改该值?

Iterator it = queue.iterator(); 

while(it.hasNext()){ 
    random = randNumber(1,2); 
     if(random == 1){ 
      queue.poll(); 
     } else { 
      queue.add("new"); 
      queue.poll(); 
     } 
} 

它给我:

Exception in thread "test" java.util.ConcurrentModificationException 
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761) 
    at java.util.LinkedList$ListItr.next(LinkedList.java:696) 

编辑@乔恩飞碟双向:

我想要做的是:

  • 我有一个队列表中,比方说大小为10,可以说:a,b,c,d ... j
  • 生成1和2,如果1之间的数字,拉(除去顶级元素),否则,如果2添加新的元素
  • 我将停止循环,直到我说3个新的元素
+0

q与队列相同吗? – Shaded 2010-05-11 18:20:13

+0

@shaded:是的,我只是编辑我的问题,以避免混淆 – 2010-05-11 18:21:15

回答

7

在一般情况下,你可以在你迭代它们的时候修改集合。另一种方法是建立一个你想应用的单独的“更改”列表,然后在完成迭代后应用它们。

另外,一些收藏支持这个功能,比如ConcurrentLinkedQueue - 但大多数可提供没有关于迭代器是否会看到当你迭代所做的更改保证。 (我怀疑这是主要是,因为它们也是线程安全的,但是我很少看到有关如果在迭代线程中修改集合会发生什么情况的文档保证)。迭代器在这里是正确的方法。相反,你可以使用:

while (!queue.isEmpty()) 
{ 
    // Put logic in here - add, poll etc 
} 

有一点要注意的是,您发布的代码不实际转发随时移动迭代器 - 它永远不会调用it.next()。这是一个强烈的建议,要么你没有完全使用迭代器,要么根本不需要它。

+0

嗯..无法做到这一点,而迭代... :( 我不明白你的替代​​方式。可以举一些例子吗? – 2010-05-11 18:19:05

+0

@javaLearner:这真的取决于什么你想达到的 - 这里有什么实际的目标,你需要你的迭代器“看到”您要添加其他项目 – 2010-05-11 18:20:18

+0

有什么办法扔ConcurrentModificationException的 – 2010-05-11 18:28:05

0

这是真的复制粘贴你的代码?

我能想到的是,你证实,qqueue是相同的队列对象的引用。
所以当迭代它时,你不能修改任何类型的列表,队列,堆栈。为了避免迭代,你可以尝试一个for(int i = 0; ..... ; i++)循环。但这不是一个好主意。因为当您使用尺寸来检查您是否在循环结束时,您正在更改尺寸。


我看了你编辑:

for (int i = 0; i < 3;) 
{ 
    boolean b = Math.random() < 0.5d; 
    if (b) 
    { 
     queue.poll(); 
    } else { 
     queue.add("new"); // or put(), I don't know exectly 
     i++; 
    } 
} 
+0

是的,它是我非常原始的代码。我复制粘贴我的代码,然后编辑它(包含变量名称),但流程是相同的。 – 2010-05-11 18:25:59

+0

@马丁:我尝试使用“for”循环,它不利于=( – 2010-05-11 18:27:06

+0

我的意思是,我复制粘贴我的代码并修改变量名,我100%肯定的是,“Q”和“队列”是引用。相同的队列对象。 – 2010-05-11 18:36:43

0

如果 '排队' 是一个列表,你可以使用ListIterator

摘录:

表迭代器,允许程序员在任一方向上遍历列表,在迭代过程中修改列表,并获得迭代器在t中的当前位置他列出。

0

您应该使用的ListIterator。它有.remove()和.set()方法,可以让你修改底层的集合,而不会影响迭代器的状态。

一般来说,修改集合中的任何其他方式将软管迭代器的状态 - 是高兴,这引发了异常,并没有做什么更阴险。