2016-12-14 110 views
1

想要將2維數組(n * n矩陣)的對角線寫入一維數組。JAVA將2維數組的對角線寫入1維數組

1 2 3 
 
4 5 6 => 1 5 9 
 
7 8 9

public int[] getDiagonalFromArray(int[][] two_d_array){ 
    int[] diagonal_array = new int[two_d_array[0].length]; 
    int k=0; 
    for (int i = 0; i < two_d_array[0].length; i++) { 
     for (int j = 0; j < two_d_array[1].length; j++) { 
      for (int l = 0; l < two_d_array[0].length; l++) { 
      diagonal_array[k]=two_d_array[i][j];} //HERE SHOULD BE THE ERROR... HOW DO I CYCLE THROUGH THE 1dim "diagonal_array"? 
      } 
     } 
    return diagonal_array; 
} 

這種方法提供了錯誤的價值觀。

這種挖礦方法,只是打印diagonale,而不是放入1dim數組中。

public void getDiagonal(int[][] two_d_array){ 
    //int[] diagonal_array = new int[two_d_array[0].length];   
    for (int i = 0; i < two_d_array[0].length; i++) { 
     for (int j = 0; j < two_d_array[1].length; j++) { 

      if (i==j) System.out.print(two_d_array[i][j]+" "); 
     } 
    }   
} 

邏輯差異在哪裏?我嘗試了第一種方法的if子句,但它引發了「outofbound」-Exception。

在此先感謝。

+0

1維 - > 1循環。不確定其他兩個循環是什麼。 – tkausl

+0

第一個循環不應該循環到'two_d_array [0] .length',而應該是'two_d_array.length'。不知道你爲什麼有三個循環?我建議只使用下面提出的解決方案之一。 – 2016-12-14 14:11:57

回答

1

爲什麼你需要多個循環?

for (int i = 0; i < two_d_array[0].length; i++) { 
    diagonal_array[i]=two_d_array[i][i]; 
} 

似乎對我來說就夠了。

0

如果您的矩陣具有相同的寬度和高度,這是一個解決方案:

public int[] getDiagonal(int[][] two_d_array){ 
int[] diagonal_array = new int[two_d_array.length];   
for (int i = 0; i < two_d_array.length; i++) { 
    diagonal_array[i] = two_d_array[i][i]; 
} 
return diagonal_array; 
+1

「如果您的矩陣具有相同的寬度和高度」 - 如果沒有,則沒有清晰的對角線。 – Andreas

0

在這裏,我考慮主對角線元素是元素集合Diagonal Elements,其中n & m是行數的和列數(每行?)。

因此,對角元素的數量永遠不會大於min(numOfRows, numOfColumns)

所以,你可以嘗試:

public int[] getDiagonalFromArray(int[][] 2DArray){ 
    int[] diagonalArray = new int[Math.min(2DArray.length, 2DArray[0].length]); 
    int k=0; 
    for (int i = 0; i < 2DArray.length && k < diagonalArray.l length; ++i) { 
      for (int j = 0; j < 2DArray[i].length && k < diagonalArray.l length; ++j) { 
       if (i == j) { 
        diagonalArray[k++]=2DArray[i][j]; 
       } 
      } 
    } 
    return diagonalArray; 
} 

加送一些邊界檢查的好辦法。

您的輸入矩陣必須至少爲矩形(正方形最有意義),否則代碼將表現不可靠。

這與@Andreas' answer相同,但爲了理解,我犧牲了性能和簡潔性。