static double [][] initialArray = {{7.432, 8.541, 23.398, 3.981}, {721.859, 6.9211, 29.7505, 53.6483}, {87.901, 455.72, 91.567, 57.988}};
public double[] columnSum(double [][] array){
int index = 0;
double temp[] = new double[array[index].length];
for (int i = 0; i < array[i].length; i++){
double sum = 0;
for (int j = 0; j < array.length; j++){
sum += array[j][i];
}
temp[index] = sum;
System.out.println("Index is: " + index + " Sum is: "+sum);
index++;
}
return temp;
}
public static void main(String[] args) {
arrayq test = new arrayq();
test.columnSum(initialArray);
}
我想获取所有列的总和,但是我不断收到出站异常。这是我得到的输出:
Index is: 0 Sum is: 817.192
Index is: 1 Sum is: 471.18210000000005
Index is: 2 Sum is: 144.7155
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at NewExam.arrayq.columnSum(arrayq.java:11)
您的外部for循环条件给您带来了问题。这是您的循环:-
for (int i = 0; i < array[i].length; i++)
现在,当i
达到值3
时,您正在尝试访问array[3].length
。这将引发您IndexOutOfBounds
异常。
由于每个内部数组的大小都相同,因此您可以将循环更改为:-
for (int i = 0; i < array[0].length; i++)
或更妙的是,只需将array[0].length
预先存储在某个变量中。但这并没有太大的区别。
我也建议您使用更好的方法来计算列的总和。避免首先迭代行。保持迭代正常,可能是这样的:-
public double[] columnSum(double [][] array){
int size = array[0].length; // Replace it with the size of maximum length inner array
double temp[] = new double[size];
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++){
temp[j] += array[i][j]; // Note that, I am adding to `temp[j]`.
}
}
System.out.println(Arrays.toString(temp));
return temp; // Note you are not using this return value in the calling method
}
因此,您可以看到您的问题已得到高度简化。我所做的是,没有将值分配给数组,而是将新值array[i][j]
添加到了现有值temp[j]
中。因此,逐渐将所有array[i][j]
的i's (rows)
值累加到temp[j]
中。这样,您就不必使用混乱的迭代。因此,只需将上述代码添加到您的方法中,然后删除旧代码即可。
即使您具有jagged-array
,即内部数组的大小也不相同,此方法也可以正常工作。但是只要记住仔细定义temp
数组的大小即可。
还请注意,我已经使用Arrays.toString(temp)
方法来打印数组。
for(int i = 0; i [for(int i=0;i<size;i++)
i
&size
绝不能在循环中更改
太近了。问题是您在for循环中使用了array[i].length
。我将其从array[i].length
更改为array[0].length
,您的问题就消失了。您在那里需要j
,但实际上还没有。
您可以做这样的事情,尽管如果您知道如何获取数组,实际上没有任何意义。大小不同的列表仍然会破坏用于计算总和的代码,您也必须更改它。
for (int i = 0, j = 0; i < initialArray[j].length; i++) {
for (; j < initialArray.length; j++) {
System.out.println(i + " " + j);
}
j = 0;
}
这是您修改的程序。
public class Main {
static double[][] initialArray = { { 7.432, 8.541, 23.398, 3.981 }, { 721.859, 6.9211, 29.7505, 53.6483 }, { 87.901, 455.72, 91.567, 57.988 } };
public double[] columnSum(double[][] array) {
int index = 0;
double temp[] = new double[array[index].length];
for (int i = 0; i < array[0].length; i++) {
double sum = 0;
for (int j = 0; j < array.length; j++) {
sum += array[j][i];
}
temp[index] = sum;
System.out.println("Index is: " + index + " Sum is: " + sum);
index++;
}
return temp;
}
public static void main(String[] args) {
new Main().columnSum(initialArray);
}
}
对于索引= 3,我也等于3,并且您的代码中具有array [i] .length,但是array具有3项,因此您在array [3] .length表达式上获得异常”>
尝试
public double[] columnSum(double [][] array){
double temp[] = new double[array[0].length];
for (int i = 0; i < array[0].length; i++){
double sum = 0;
for (int j = 0; j < array.length; j++){
sum += array[j][i];
}
temp[i] = sum;
System.out.println("Index is: " + i + " Sum is: "+sum);
}
return temp;
}
由于不存在巡回代码而试图获取arr[3].length
时遇到的问题,简单的解决方法是sum = sum+arr[i][j]
,其中i
表示row
,j
表示column
。>
int row = arr.length;
int col = arr[0].length;
for(int j = 0; j < cols; j++)
{
int sum = 0;
for(int i = 0; i < rows; i++)
{
sum = sum + input[i][j];
}
}