2015-06-25 129 views
0

我有類似下面:將arraylist的arraylist轉換爲數組?

ArrayList<Integer>[] aL = new ArrayList[25]; 
for (int i = 0; i < aL.length; i++) { 
    aL[i] = new ArrayList<Integer>(); 
} 

一些邏輯後,我遇到的結構如下圖所示:

aL[0] = {492,19,183,193}; 
aL[1] = {13}; 
aL[2] = {19,56}; 
aL[3] = {}; 
aL[4] = {1}; 
... 

我想連接aL到一個新的連續陣列。上述示例的最終結果將爲newArray = {492,19,183,193,13,19,56,1,...}。要注意的是,我確切地知道應該有多少整數。我試過如下:

newArray = new int[100]; //recall the number of ints is defined, ex. 100 
int a = 0; 
for (int i = 0; i < aL.length; i++) { 
    for (int k = 0; k < aL[i].size(); k++) { 
     newArray[a] = aL[i].remove(0); 
     a++; 
    } 
} 

在打印數組時,有些值丟失。我正在檢查嵌套循環迭代的次數,有時候例如aL[i].size()5,它可能只會迭代4次。

+0

請勿在遍歷時修改列表 - 用'newArray [a] = aL [i] .get(k);' – Smutje

+0

@Smutje替換「刪除」行,好點。我並不認爲for循環的結束條件是動態的,即。 'aL [i] .size()'隨着元素被刪除而改變,並且反映在循環條件中。 – gator

+0

它應該是'newArray [a] = aL [i] .get(k);'而不是'0'。 – Codebender

回答

1

如果你必須先拆除的ArrayList元素,同時遍歷它們,你應該使用while循環:

while (aL[i].size() > 0) { 
    newArray[a] = aL[i].remove(0); 
    a++; 
} 

然而,正如Smutja評論說,這是最好遍歷的ArrayList,而無需修改它們。

newArray = new int[100]; //recall the number of ints is defined, ex. 100 
int a = 0; 
for (int i = 0; i < aL.length; i++) { 
    for (int value : aL[i]) { 
     newArray[a] = value; 
     a++; 
    } 
} 
1
for(int k = 0; k < aL[i].size() ; k++) { 
    newArray[a++] = aL[i].remove(0); 
} 

讓我們來看看這裏發生了什麼!
你開始具有5個元素的列表:
- k == 0aL[i].size() == 5
5所以走在for環,刪除列表和增量k的第一元件
- k == 1aL[i].size() == 4
4 ,相同
- k == 2aL[i].size() == 3
3,相同
- k == 3aL[i].size() == 2
2是假的,所以你停止

正如你所看到的,只有3從列表中刪除:)元素

有很多的解決方案,例如:

for(int k = 0; k < aL[i].size() ; k++) { 
    newArray[a++] = aL[i].get(k); 
} 
aL[i].clear()