2016-12-14 14 views
1

2次元配列(n * n行列)の対角を1次元配列に書きたいとします。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; 
} 

この方法は間違った値を提供します。

この方法は動作しますが、対角線を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ループ。他の2つのループが何であるかはわかりません。 – tkausl

+0

最初のループは 'two_d_array [0] .length'にループするべきではなく、むしろ' two_d_array.length'にループするべきです。なぜあなたは3つのループを持っているのか分かりませんか?私はちょうど以下の提案された解決の1つを使用することを勧めます。 –

答えて

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

、私は主要な対角要素がn & mは、行数の要素Diagonal Elementsの集合であると考えます列の数(行ごとに?)。

したがって、対角要素の数は決して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と同じですが、ここでは理解のためにパフォーマンスと簡潔さを犠牲にしています。