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

}

すべての列の合計を取得したいのですが、範囲外の例外が引き続き発生します。これは私が得る出力です:

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、値 に達する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 に答える
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 に答える
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].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);
  }
}
于 2013-01-13T11:36:31.067 に答える