2012-01-04 53 views
0

如何避免java.lang.ArrayIndexOutOfBoundsException如果indexes的大小是先验未知?如何填充阵列如果其大小是先验未知

Integer[] indexes = new Integer[]{}; 
int num = 0; 
for (ArrayList<Integer[]> arr: list) { 
    for (int i=0; i<arr.length; i++) { 
     indexes[num] = arr[i]; 
     num++; 
    } 
} 

的目标是从二维数组ArrayList<Integer[]> list得到一个一维数组Integer[] indexes

UPDATE

例如:

 
list[0] = {1,2,3} 
list[1] = {4} 

我需要得到:

 
indexes = {1,2,3,4} 
+0

您的代码不正确。 – 2012-01-04 21:18:30

+0

我知道这是不正确的。因此我问如何避免错误并更正此代码。 – 2012-01-04 21:19:35

+0

是'list',一个Integer []的列表吗? 'arr.length'是错误的,因为'ArrayList'没有'.length'。 – 2012-01-04 21:21:18

回答

3

使用新的ArrayListnewList.add(arr[i])),然后调用toArray()

Integer[] indexes = newList.toArray(new Integer[newList.size()]); 

不使用中间列表的不太有效的解决方案 - 您可以循环整个结构一次来计算元素。然后用预先计算的大小实例化阵列。

+0

您提供使用:Object [] indexes = list.toArray ()?我试过了,但它提供了一个二维数组'索引'。 – 2012-01-04 21:20:55

+0

不是'list.toArray()'。在存储索引的位置使用新的列表 – Bozho 2012-01-04 21:22:04

1

几个方法映入脑海:通过一个ArrayList,将适当增加

  1. 运行,然后使用.toArray()一次完成。这不是有效的内存。
  2. 遍历arr并计算最大大小,形成该大小的数组,然后重新填充。
0

你不能。初始化数组时,您必须指定其大小。所以,如果你不知道大小,你可以选择声明一个非常大的数组,并希望一切都适合它(与所有相关的缺点,如内存开销,array.length,变得很无用,... ... )。或者您可以选择使用内部使用阵列的ArrayList,但足够智能以在需要时增加其大小。

你也可以通过在需要的时候将数组拷贝到另一个更大的数组来实现这个,但是你基本上重写了ArrayList

如果您需要将列表转换后在返回数组可以使用toArray方法

编辑:

基于问题的额外信息的小更新。如果你有一个ArrayList<Integer[]>转换成一维数组,你可以使用以下步骤

  1. 创建一个新的ArrayList<Integer>
  2. 环比现有的列表(其中包含Integer[]),并使用Collections#addAll方法添加的所有该数组中的元素到新名单
  3. toArray方法将您的列表,以数组
0
  1. 待办事项不初始化阵列为Integer[] indexes = new Integer[]{};

您正在使它成为长度为零的数组。你应该做的是这样的:

int maxNum=0; 
for (ArrayList<Integer[]> arr: list) { 

    maxNum += arr.length; 

} 

Integer[] indexes = new Integer[maxNum]; 
num=0; 
for (ArrayList<Integer[]> arr: list) { 
    for (int i=0; i<arr.length; i++) { 
     indexes[num+i] = arr[i]; 

    } 
    num+=arr.length; 
} 

我在那里做的是确定最大数组大小,然后初始化数组。

之后,我用ArrayList中的每个数组填充它,通过前一个数组的值来抵消我的输入。这样说,有更有效的方法来做到这一点,但如果你必须有一个ArrayListInteger[] s,这就是我该怎么做的。

0

每一件事情添加到单个ArrayList和使用 T[] toArray(T[] a)Object[] toArray()使得它的一个阵列...的firstmethod是类型安全的,所提供的阵列可以,但musst并不需要的长度,将如果长度小于重新分配列表

1

假设list的大小定义如下:

List<Integer[]> list = new ArrayList<Integer[]>(); 

你可以这样做:

List<Integer> indexList = new ArrayList<Integer>(); 
for (Integer[] arr: list) { 
    indexList.addAll(Arrays.asList(arr)); 
} 

并最终转换为阵列:

Integer[] indexes = indexList.toArray(new Integer[indexList.size()]{}); 
相关问题