0

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

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

public void intoArray()
{

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

}
4

3 回答 3

0

不要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

循环的第二次迭代while

For :
    1e Iteration : carQueue.size() = 2, m = 0
    2e Iteration : carQueue.size() = 1, m = 1   <---- Exit the loop

最后,您的队列为空,因为while循环的第一个和第二个对象被队列的最后两个元素替换。

Javadoc

Poll :检索并移除此队列的头部,如果此队列为空,则返回 null。

将初始大小保存在int变量中:

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

}
于 2013-11-02T22:58:52.110 回答
0

你说你知道队列包含 5 个对象,你为什么不试试:

   public void intoArray()
    {    
            for(int m=0; m < 5; m++)
            {side[m] = carQueue.poll();}
    }
于 2013-11-02T23:08:48.807 回答
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();
    }
}
于 2013-11-02T23:09:26.123 回答