2016-04-04 13 views
2

現在、私は8x8 2D配列ボードにランダムな0と1を生成するプログラムに取り組んでいます。私は何をしているのは対角線上のすべての数字が同じであれば(だけでなく、任意の対角線の隅から開始)かどうかを確認しているJava - 2D配列チェック対角番号ボード

例:

int[][] array = { 
    {0, 0, 0, 0, 0, 0, 0, 1}, 
    {0, 0, 1, 0, 1, 0, 1, 0}, 
    {0, 0, 0, 0, 1, 1, 1, 0}, 
    {0, 0, 0, 0, 1, 1, 1, 0}, 
    {0, 0, 1, 1, 0, 1, 1, 0}, 
    {0, 0, 1, 0, 0, 0, 1, 0}, 
    {0, 1, 0, 0, 0, 0, 0, 0}, 
    {1, 0, 0, 1, 1, 1, 1, 0} 
    }; 

だから、偶然であれば、すべての左上隅(0,0)、(1,1)...(7,7)から始まる数字はすべて0または1のいずれかであることを示すスキャナに出力する必要があります。「主対角0 "(上記の例から)。

また、この例では、右上から左下に向かって数字「1」が斜めに繰り返されていることがわかります。次に、「1の小角があります」と表示する必要があります。

これまでのところ、配列に数値を生成して入力する方法を理解しましたが、確認方法はわかりません。これは私がこれまで持っているものです。

public class javaTest{ 
// Main method 
public static void main(String[] args) { 

    int[][] array = { 
    {0, 0, 0, 0, 0, 0, 0, 1}, 
    {0, 0, 1, 0, 1, 0, 1, 0}, 
    {0, 0, 0, 0, 1, 1, 1, 0}, 
    {0, 0, 0, 0, 1, 1, 1, 0}, 
    {0, 0, 1, 1, 0, 1, 1, 0}, 
    {0, 0, 1, 0, 0, 0, 1, 0}, 
    {0, 1, 0, 0, 0, 0, 0, 0}, 
    {1, 0, 0, 1, 1, 1, 1, 0} 
    }; 

    // Print array numbers 
    for (int i = 0; i < array.length; i++) { 
     for (int j = 0; j < array[i].length; j++) 
      System.out.print(array[i][j] + " "); 
     System.out.println(); 
    } 
    // Print checkers 

    checkMajorDiagonal(array); 
} 
// Check major diagonal 
public static void checkMajorDiagonal(int array[][]) { 
    int majDiag; 
    boolean isMatching = true; 
    int row = 0; 
    for(row = 0; row < array.length; row++){ 
     majDiag = row; 
     if(array[row][row] != array[row+1][row+1]){ 
      isMatching = false; 
      break; 
     } 
    } 
    //If all elements matched print output 
    if(isMatching) 
     System.out.println("Major diagnol is all " + array[row][row]); 
} 
} 

けれども、私はエラーがあるとしてそれになりたいと、これまで動作していない持っている、と私はまだマイナーな対角線を行うために持っているもの。前もって感謝します。

答えて

3

すでに多くの回答があります。これを行うもう一つの方法があります。あなたは正しい軌道に乗っていますが、対角要素を次の要素などでチェックすることで、複雑にする必要はありません。各対角要素を最初の対角要素でチェックしてください。あなたが違いを見つける瞬間、あなたは点検をやめます!

public static void checkDiagonal(int[][] array){ 

    // Start with the assumption that both diagonals are consistent. 
    boolean majorConsistent = true; 
    boolean minorConsistent = true; 

    int length = array.length; 

    int tempMajor = array[0][0];  // all elements in the Major must be equal to this 
    int tempMinor = array[0][length-1]; // all elements in the Minor must be equal to this 

    // Check major diagonal, and update the boolean if our assumption is wrong. 
    for(int i=0; i<length; i++){ 
     if (array[i][i] != tempMajor) { //(0,0);(1,1);(3,3);... 
      majorConsistent = false; 
      break; 
     } 
    } 

    // Check minor diagonal, and update the boolean if our assumption is wrong. 
    for(int i=0,j=length-1; i<length; i++,j--){ 
     if (array[i][j] != tempMinor) { //(0,7);(1,6);(2,5);... 
      minorConsistent = false; 
      break; 
     } 
    } 

    System.out.println("Major elements all same = "+majorConsistent); 
    System.out.println("Minor elements all same = "+minorConsistent); 

} 

この方法であなたはまだO(n)のにチェックの両方をやっているし、あなたがループの入れ子にする必要はありません! 注:冗長性を取り除くためにこのコードを修正することができます。つまり、forループなどが1つあります。

1

エラーはおそらく、行< array.length中にループするが、配列[行+ 1]にインデックスを付けるという事実から来ていると考えられます。これにより、境界外の例外が発生します。それは疎結合にするために、変数に配列、すなわち9の

int maxIndex = array.length - 1; 
for(row = 0; row < maxIndex; row++){ 
    majDiag = row; 
    if(array[row][maxIndex - row] != array[row+1][maxIndex - (row+1)]){ 
    isMatching = false; 
    break; 
    } 
} 
0
int diagonalValue = 0; 
for(int i = 0; i < 8 ; i++){ 
    diagonalValue = array[i][j]; 
    for(int j = 0; j < 8 ; j++) 
     if(i==j){ 
      if(array[i][j]==diagonalValue){ 
      counter++; 
      } 
      else 
       break; 
     } 
    } 
} 
if(counter==8) // yes they are same else not 

キープサイズ:マイナー対角線をチェックするための

は、似たようなを試してみてください。

for(row = 0; row < array.length; row++){ 
    for(col = 0; col < array[i].length; col++){ 
     if(row+col==array[i].length){ 
       array[row][col] // this would be your minor diagonal element row wise 
    } 
} 
1

いくつかのポイントあなたはJava 8を使用しています。手動で値を繰り返し処理するのではなく、これは以前の値をチェックするよりも直接的なアプローチかもしれません。

if (IntStream.range(0, size).map(n -> array[n][n]).allMatch(n -> n == 0)) { 
} 

if (IntStream.range(0, size).map(n -> array[n][size-n-1]).allMatch(n -> n == 1)) { 
} 
+0

ありがとうございます。私はどのようにマイナーな対角線で始めるだろうか? – Flinze

+0

がanwerに追加されました – nullpointer

+0

マイナーな対角線に対する私の解(上)は、より効率的です(O(nの代わりにO(n))。しかし、この場合は問題ではないかもしれません。 – nhouser9

1

の場合:

int majDiag; 
boolean isMatching = true; 
int row = 0; 
for(row = 0; row < array.length; row++){ 
    majDiag = row; //not being used anywhere 
    if(array[row][row] != array[row+1][row+1]){ //out of bounds with row+1 
     isMatching = false; 
     break; 
    } 
} 

あなたは

for(row = 0; row < array.length-1; row++) 

マイナー対角線ロジックとしてループコードをmajDiag未使用の変数を削除し、変更することができますあなたの方法checkMajorDiagonalについて