2016-06-15 74 views
-2

所以我想從我已經放入正常數組的ArrayList中移除Integer。從ArrayList中放入數組並將其刪除for循環

我現在所擁有的是:

int[] playersArray = null; 

ArrayList<Integer> spelers = new ArrayList<Integer>(); 

的table.lengthü下這裏看到的是表有量,表[J]。長度爲玩家每個表都可以得到數額。它的效果很好,但是它從PlayerList中移除了錯誤的Integer,它將刪除下一個,而不是放入playersArray中的那個。

for(int j = 0; j < table.length; j++){ 
    playersArray = new int[table[j].length]; 
    for(int i = 0; i < table[j].length; i++){ 
     playersArray[i] = playersList.get(i); 
     playersList.remove(i); 
    } 
    table[j] = playersArray; 
    System.out.println("tafel: " + (j+1) + " " + Arrays.toString(tafel[j])); 
} 
+0

您是否嘗試過閱讀「ArrayList#remove」的作用以及列表內容的行爲方式?只需使用[這裏]的方法之一(http://stackoverflow.com/questions/718554/how-to-convert-an-arraylist-containing-integers-to-primitive-int-array)並清除'playersList'之後... – Tom

+0

也顯示'table'的聲明。 –

回答

1

看看你的循環:

for(int i = 0; i < table[j].length; i++){ 
    playersArray[i] = playersList.get(i); 
    playersList.remove(i); 
} 

i == 0playersList刪除項0。這會將所有後續元素向下移動一個,將項目1移至0,將項目2移至1,依此類推。然後您將i增加到1.現在您get(i)產生項目1,但是這是新的項目1. 舊的項目1已被移至項目0!此時您正在檢索舊的項目2。

這是一個爲什麼你不應該在迭代它的時候在結構上改變集合的例子。

1

ArrayList.remove文檔:

移除此列表中的指定位置的元素。 將任何後續元素向左移(從其索引中減去1)。

因此,如果您playersList是這樣

playersList[0] = 1 
playersList[1] = 2 
playersList[2] = 3 
playersList[3] = 4 

playersList.remove(0)後的名單將在

playersList[0] = 2 
playersList[1] = 3 
playersList[2] = 4 

所以接下來的操作(playersList.remove(1))將不會被正確的元素上執行。

如果您只需要遍歷所有元素,則只需用playersList.remove(i)替換爲playersList.remove(0)即可,playersList.get(i)也是如此。

0

正如其他人所解釋的,當您移除每個元素時,您正在摺疊列表,導致您的迭代跳過元素。這裏有幾種選擇:

1)保持拉出的第一個元素:

​​

2)拆下迭代使用Iterator.remove()同時:

Iterator<Integer> playersIter = playersList.iterator(); 
for(int j = 0; j < table.length; j++){ 
    ... 
    for(int i = 0; i < table[j].length; i++){ 
     playersArray[i] = playersIter.next(); 
     playersIter.remove(); 
    } 
    ... 
} 

3)如果你不期望或別不需要剩餘元素,您可以通過其索引獲取每個元素,並在完成後清除列表:

​​

所有這些解決方案都假設playersList有足夠的元素來填充table,就像您在示例中所做的那樣。