Java - 2D数组检查对角线数字板

5

目前我正在开发一个程序,用于在8x8的二维数组中生成随机的0和1。我的任务是检查对角线上的所有数字是否相同(从角落开始,而不仅仅是任意对角线)。

例如:

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 diagonal is all " + array[row][row]);
    }
}

虽然我目前的代码还不能按照我的意愿工作,因为出现了一个错误,而且我还需要处理小对角线。提前感谢您。

5个回答

4

已经有很多答案了。这里是另一种实现方法。您走在正确的轨道上,但没有必要通过检查对角元素与下一个元素等来使事情变得复杂。只需将每个对角线元素与第一个对角线元素进行比较即可。一旦发现差异,就停止检查!

 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循环!请注意,您可以优化此代码以消除冗余,即只有一个for循环等。

2

如果您正在使用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)) {
}

1
错误可能来自于您在循环时使用了row < array.length,但是您却索引了array[row+1]。这将导致数组越界异常。
检查次对角线,请尝试类似的方法:
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;
  }
}

1

关于你的方法 checkMajorDiagonal 的一些要点:

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

你可以删除未使用的majDiag变量,并将循环代码更改为
for(row = 0; row < array.length-1; row++)

次对角线逻辑:

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

谢谢。不过我该如何开始处理次对角线呢? - Flinze
已将答案添加。 - Naman
请注意,我上面提供的次对角线解决方案明显更有效(O(n)而不是O(n平方))。然而,对于这种情况可能并不重要。 - nhouser9

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

将数组大小即9保存在变量中,使其松散耦合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接