如果数组的大小是先前未知的,如何填充数组

时间:2012-01-04 21:14:30

标签: java arrays dynamic integer fill

如果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++;
   }
}

目标是从二维数组Integer[] indexes获取一维数组ArrayList<Integer[]> list

更新

例如:

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

我需要得到:

indexes = {1,2,3,4}

6 个答案:

答案 0 :(得分:3)

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

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

不使用中间列表的效率较低的解决方案 - 只需计算元素数就可以循环整个结构。然后使用预先计算的大小实例化数组。

答案 1 :(得分:1)

我想到了一些方法:

  1. 运行将适当增长的ArrayList,然后在完成后使用.toArray()。这不是内存效率。
  2. 迭代 arr 并计算最大尺寸,形成该尺寸的数组,然后重复填充。

答案 2 :(得分: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()]{});

答案 3 :(得分:0)

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

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

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

编辑:

基于问题中的额外信息的小更新。如果您必须将ArrayList<Integer[]>转换为一维数组,则可以使用以下步骤

  1. 制作新的ArrayList<Integer>
  2. 遍历现有列表(包含Integer[])并使用Collections#addAll方法将阵列的所有元素添加到新列表中
  3. 使用toArray方法
  4. 将列表转换为数组

答案 4 :(得分:0)

  1. 不要将数组初始化为Integer[] indexes = new Integer[]{};
  2. 你正在使它成为一个长度为零的数组。你应该做的是:

    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中的每个数组填充它,使我的输入偏移前一个数组的值。

    话虽如此,有更有效的方法可以做到这一点,但如果你必须ArrayList Integer[],我就是这样做的。

答案 5 :(得分:0)

将每个东西添加到单个ArrayList并使用 T[] toArray(T[] a)Object[] toArray()创建一个数组...第一个方法是类型安全,提供的数组可以但不需要长度,它将是如果其长度短于列表的大小,则重新分配