奇怪的队列到数组错误(Java)

时间:2013-11-02 22:50:01

标签: java arrays queue

所以我的队列包含5个对象(我已经检查过),但是当我将这些对象转移到数组中时,最后2个总是被遗漏,这很奇怪,因为我在方法之后检查了队列的大小完成并且它说队列现在是空的,但我的数组总是短2个对象......

这是我的into数组方法的代码:

public void intoArray()
{

    while(!carQueue.isEmpty())
    {
        for(int m=0; m<=carQueue.size(); m++)
        {side[m] = carQueue.poll();}
    }

}

3 个答案:

答案 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();
    }
}