如果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}
答案 0 :(得分:3)
使用新的ArrayList
(newList.add(arr[i])
),然后拨打toArray()
:
Integer[] indexes = newList.toArray(new Integer[newList.size()]);
不使用中间列表的效率较低的解决方案 - 只需计算元素数就可以循环整个结构。然后使用预先计算的大小实例化数组。
答案 1 :(得分:1)
我想到了一些方法:
答案 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[]>
转换为一维数组,则可以使用以下步骤
ArrayList<Integer>
Integer[]
)并使用Collections#addAll
方法将阵列的所有元素添加到新列表中toArray
方法答案 4 :(得分:0)
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
中的每个数组填充它,使我的输入偏移前一个数组的值。
话虽如此,有更有效的方法可以做到这一点,但如果你必须ArrayList
Integer[]
,我就是这样做的。
答案 5 :(得分:0)
将每个东西添加到单个ArrayList并使用 T[] toArray(T[] a)或Object[] toArray()创建一个数组...第一个方法是类型安全,提供的数组可以但不需要长度,它将是如果其长度短于列表的大小,则重新分配