目前,我正致力于在8x8 2D阵列板中生成随机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或者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]);
}
}
虽然我到目前为止没有按照我想要的方式工作,因为有一个错误,我仍然需要做一个小的对角线。提前致谢。
答案 0 :(得分: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循环! 注意,您可以优化此代码以删除冗余,即具有单个for循环等。
答案 1 :(得分:1)
The error probably comes from the fact that you loop while row < array.length but you index into array[row+1]. This will result in an out of bounds exception.
For checking the minor diagonal, try something similar:
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;
}
}
答案 2 :(得分: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
}
}
答案 3 :(得分: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)) {
}
答案 4 :(得分: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)保存在变量中以使其松散耦合。