尽管使用带有堆栈的迭代器
,我仍然遇到并发修改异常package samplecodes;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class ReOrderStack {
public static Stack<Integer> reorder(Stack<Integer> s )
{
Queue <Integer> q= new LinkedList<Integer>();
if(s==null|| s.isEmpty())
return s;
// Use an iterator to prevent concurrent modification exception!
Iterator<Integer> it = s.iterator();
while(it.hasNext())
{
Integer val= it.next();// concurrent modification exception!
if(val>=0)
{
s.remove(val);
q.add(val);
}
}
//we've inspected the stack
//add back from the queue to stack
while(!q.isEmpty())
{
Integer val=q.remove();
s.push(val);
}
return s;
}
}
有什么想法?
答案 0 :(得分:4)
Stack.remove
不安全。它与ConcurrentModificationException
一起发生Iterator
。为避免ConcurrentModificationException
使用Iterator.remove()
。
尝试,
Iterator<Integer> it = s.iterator();
while(it.hasNext())
{
Integer val= it.next();
if(val>=0)
{
it.remove(); //Use Iterator.remove
//s.remove(val);
q.add(val);
}
}
答案 1 :(得分:0)
迭代时无法修改堆栈。您必须删除行s.remove()
以防止发生此错误。它发生是因为迭代器有一个现在与原始版本不同的副本。如果要删除ever元素并添加到队列,可以使用以下代码:
while(!s.empty()) {
val = s.pop();
if(val>=0) {
q.add(val);
}
}