3
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);

}

我想获得所有列的总和,但我不断收到 outofbounds 异常。这是我得到的输出:

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)
4

5 回答 5

3

您的外部 for 循环条件给您带来了问题。这是你的循环: -

for (int i = 0; i < array[i].length; i++)

现在,当i达到 value时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]for all的值i's (rows)被总结为temp[j]. 这样您就不必使用令人困惑的迭代。因此,只需将上面的代码添加到您的方法中,然后删除旧的。

这种方法也可以正常工作,即使你有jagged-array,即你的内部数组大小不同。但请记住temp仔细定义数组的大小。

另请注意,我使用Arrays.toString(temp)方法来打印数组。

于 2013-01-13T11:37:20.663 回答
1

您的代码的问题是当它尝试获取时arr[3].length,因为不存在像sum = sum+arr[i][j]wherei引用rowj引用这样的简单解决方案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];
            }

        }
于 2020-01-30T15:11:47.710 回答
0

for (int i = 0; i < array[i].length; i++)

for(int i=0;i<size;i++)

i&size绝不能在循环中改变

于 2013-01-13T11:34:38.247 回答
0

很近。问题是您array[i].length在 for 循环中使用。我将它从 更改array[i].lengtharray[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);
  }
}
于 2013-01-13T11:36:31.067 回答
0

对于 index = 3,i 也等于 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;
}
于 2013-01-13T11:49:14.167 回答