Java – 2Darrays检查对角线编号板

目前我正在开发一个在8×8 2Darrays板中生成随机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 diagnol is all " + array[row][row]); } } 

虽然我到目前为止没有按照我想要的方式工作,因为有一个错误,我仍然需要做一个小的对角线。 提前致谢。

已经有很多答案了。 这是另一种方法。 你是在正确的轨道上,但是没有必要通过检查具有下一个元素的对角线元素来使事情变得复杂,依此类推。 只需用第一个对角线元素检查每个对角元素。 你发现差异的那一刻,你停止检查!

  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
		      	

该错误可能来自于您在行

要检查次要对角线,请尝试类似的操作:

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

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

关于你的方法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 } } 
  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)保持在变量中以使其松散耦合。