我正在尝试将Java中的二维数组转换为一维数组。 我不能使用任何其他数据结构,ArrayList,集合等进行临时存储。 只能分配一个数组-该数组将从方法中返回。
在方法中输入了三个数组,以验证程序。测试1具有2行3列和2列的2D数组,测试2具有3行1列的2D数组,并且测试3具有空列。
我当前的代码是:
public static int[] twoDConvert(int[][] nums) {
int index = 0;
int[] combined = new int[nums.length*3];
if (nums.length == 0) return combined;
for (int row = 0; row < nums.length; row++) {
for (int col = 0; col < nums.length; col++) {
combined[index] += nums[row][col];
index++;
}
}
return combined;
}
第一个测试正常工作,但是由于某种原因,第二个测试抛出ArrayIndexOutOfBoundsException(索引1超出长度1的范围)。 无论组合数组的长度有多大,这种情况都会发生。 我该如何解决?
答案 0 :(得分:2)
我们创建一个单个的整数数组,其长度由size方法确定。 Size采用二维数组,并找到每一行中所有列的总和,然后返回该总和。我们检查长度是否为0,如果是,则返回。然后,我们遍历所有行,然后遍历该行中的所有列。然后,我们将该行和列中的值分配给数组中的下一个索引。不幸的是,据我所知,我们无法进行任何数学运算来确定基于行/列的索引,因为它们可能是可变大小的。
public static int[] twoDConvert(int[][] nums) {
int[] combined = new int[size(nums)];
if (combined.length <= 0) {
return combined;
}
int index = 0;
for (int row = 0; row < nums.length; row++) {
for (int column = 0; column < nums[row].length; column++) {
combined[index++] = nums[row][column];
}
}
return combined;
}
private static int size(int[][] values) {
int size = 0;
for (int index = 0; index < values.length; index++) {
size += values[index].length;
}
return size;
}