2015-06-25 128 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()