2013-01-13 93 views
1
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) 
+1

'總和+ =陣列[j]的[I];'應'總和+ =陣列[i] [j];' – Oren

+1

@Oren ..不,它不應該。 OP將列合併在一起,而不是行。所以,這條線是正確的。 –

回答

1

你的循環外部條件給你帶來了問題。這是你的循環: -

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]。因此,所有i's (rows)array[i][j]的值逐漸得到總結在temp[j]。這樣你就不必使用混淆迭代。所以,只需將上面的代碼添加到您的方法,並刪除舊的。

即使您有jagged-array,即內部數組的大小不一樣,此方法也可以正常工作。但請記住仔細確定temp陣列的大小。

另外請注意,我已經使用Arrays.toString(temp)方法來打印數組。

+0

謝謝,這個修好了。 – user1706295

0

的for(int i = 0;我<陣列[I]。長度;我++)

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

i & size絕不能在迴路

變化
0

太近了。問題在於你在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); 
    } 
} 
0

爲指數= 3,我也與3等於和你有數組[我]。長度在你的代碼,但陣列有3個項目,所以你得到數組[3]。長度表達

試異常它

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