我不断收到错误:线程“main”中的异常java.lang.IndexOutOfBoundsException:索引:2,大小:2。当我将一个值推入其中后弹出并查看时显示为null。当我从空队列弹出/偷看时,它给了我错误。这不是将artay列表与队列一起使用的正确方法吗?
public T peek()
{
if(isEmpty())
throw new RuntimeException("Can't peek here");
return value.get(value.size()-1););
}
public T pop()
{
if(isEmpty())
throw new RuntimeException("Can't pop here");
T number = value.get(begin);
value.set(begin, null);
//value.remove(value.size()-1);
begin++;
return number;
}
答案 0 :(得分:0)
在获得begin
之后,立即将其设置为null。将begin
设置为null时,还将number
设置为null,因为number和begin引用相同的对象。
从队列中“弹出”的正确方法如下:
在代码中,它看起来像这样。对于我的例子,我假设value
是你的ArrayList。也许values
可能不那么令人困惑。
T number = value.get(0); // Reference the first item
value.remove(0) // Remove it from the list
return number; // Return the reference
在执行任何这些操作之前,您应检查列表是否为空。
if(val.size() > 0) {
// Do Stuff
} else {
throw CannotPopFromAnEmptyQueueException();
}
值得一提的是,在谈论一个队列时,“pop”并不是一个好词。 入队和出队是更正式的条款。 Pop 和 push 是堆栈术语。
答案 1 :(得分:0)
在第一次pop / peek之后,队列中将有一个元素,其值等于“null”
PSB摘自您的代码:
T number = value.get(begin);
value.set(begin, null);
//value.remove(value.size()-1);
begin++;
在第一次迭代中,begin将等于0.所以,你正在做类似value.set(0,null)和开始++的事情,所以现在开始= 1。
因此,当你下次去pop / peek时,你实际上是尝试在索引1处获取不存在的元素,因此你得到这个indexOutOfBoundException。