所以我的队列包含5个对象(我已经检查过),但是当我将这些对象转移到数组中时,最后2个总是被遗漏,这很奇怪,因为我在方法之后检查了队列的大小完成并且它说队列现在是空的,但我的数组总是短2个对象......
这是我的into数组方法的代码:
public void intoArray()
{
while(!carQueue.isEmpty())
{
for(int m=0; m<=carQueue.size(); m++)
{side[m] = carQueue.poll();}
}
}
答案 0 :(得分:0)
请勿在{{1}}循环中使用carQueue.size()
,for
方法会从队列中删除对象。
poll
循环的第一次迭代:
while
For :
1e Iteration : carQueue.size() = 5, m = 0
2e Iteration : carQueue.size() = 4, m = 1
3e Iteration : carQueue.size() = 3, m = 2
4e Iteration : carQueue.size() = 2, m = 3 <---- Exit the loop
循环的Seconde迭代:
while
最后,您的队列为空,因为For :
1e Iteration : carQueue.size() = 2, m = 0
2e Iteration : carQueue.size() = 1, m = 1 <---- Exit the loop
循环,数组的第一个和第二个对象被队列的最后两个元素替换。
来自Javadoc:
轮询:检索并删除此队列的头部,或返回null 如果此队列为空。
将初始大小保留在while
变量中:
int
答案 1 :(得分:0)
你说你知道队列包含5个对象,你为什么不试试:
public void intoArray()
{
for(int m=0; m < 5; m++)
{side[m] = carQueue.poll();}
}
答案 2 :(得分:0)
此代码存在一些问题:
while(!carQueue.isEmpty())
第二次检查此条件仅在for循环结束后。
for(int m=0; m<=carQueue.size(); m++)
你跑到m == carQueue.size()
这是一个索引太远
side[m] = carQueue.poll();
当你poll()
更改队列大小时,会使“for-loop”结束比你计划的更快,然后“while”使它重新开始并运行以前的元素。
另一种方法是使用Iterator
:
Car[] side = new Car[carQueue.size()];
Iterator<Car> iter = carQueue.iterator();
int i = 0;
while(iter.hasNext()){
side[i++] = iter.next(); // here you can also use iter.remove()
// if you want to empty the queue
}
或者,也可以按如下方式修改您的解决方案:
public void intoArray()
{
int m=0;
while(!carQueue.isEmpty())
{
side[m++] = carQueue.poll();
}
}