2013-11-02 13 views
0

所以我的隊列包含5個對象(我已經檢查過),但是當我將這些對象轉移到一個數組中時,最後2總是被排除,這很奇怪,因爲我檢查了該方法經過隊列的大小做,它說的隊列現在是空的,但是我的數組總是短暫的2個對象...奇怪的隊列到數組錯誤(Java)

這裏是我的成陣列的方法代碼:

public void intoArray() 
{ 

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

} 
+0

檢查循環條件。所涉及的元素是否會在每次迭代中發生變化?感謝老闆 –

回答

0

請勿在for循環中使用carQueue.size()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循環

Seconde系列迭代:

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

最後,你的隊列是空的,因爲在while循環,第一和數組的第二個對象被隊列的最後兩個元素替換。

Javadoc

民意調查:獲取並移除此隊列的頭部,或返回null 如果這個隊列是空的。

保存在int變量的初始大小:

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

} 
+0

,這個作品!我仍然不明白爲什麼它最初不起作用。 – user2855405

+0

你確定問題沒有問題,但最終解決方案中的while循環完全是多餘的...... – alfasin

+0

Cmon,我的意思是我知道while循環是多餘的,而且這段代碼很糟糕......這只是一個快速修復讓他明白這個問題。 –

0

你說你知道隊列包含5個對象,爲什麼不試試:

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

,因爲隊列中的對象是一個變量,並不總是其中的5個,但無論如何感謝兄弟的幫助。 – user2855405

+0

@ user2855405你是最受歡迎的。 – FlowerFire

0

有一個此代碼很少出現問題:

while(!carQueue.isEmpty()) 

第二次檢查此條件僅在for循環結束之後。

for(int m=0; m<=carQueue.size(); m++) 

運行,直到m == carQueue.size()這是一個索引太遠

side[m] = carQueue.poll(); 

當你poll()您更改隊列大小這使得「for循環」結束遲早比你計劃,那麼「而「使得它重新開始並且遍佈以前的元素。

另一種方式來做到這一點是通過使用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(); 
    } 
} 
+0

似乎是一個很好的解決方案,但我只是找到了一個更簡單的,謝謝反正男人! – user2855405

+0

@ user2855405我覺得很難想到比這更簡單的解決方案 - 但最適合你的是什麼:) – alfasin