这个方法使用int [] []有什么问题?

时间:2014-06-12 18:59:38

标签: java arrays 2d

如果2D数组的列中有多个1,则该方法应返回true,但它不起作用。我无法弄清楚它有什么问题,所以我想我会得到一些专家意见。

示例:

10010
01001
10100

将返回true,因为第一列中有2个。

这是代码

public static boolean isVert(int[][] x) { //checks for more than one 1 in columns
int count = 0;
boolean break2 = false;
boolean check = false; //false means no 2 (or more) queens in same column
for (int i = 0; i < x.length; i++) {
    count = 0;
    for (int j = 0; j < x[i].length; j++) {
        if (x[i][j] == 1) {
            count++;
        }
        if (count > 1) {
            break2 = true;
            check = true;
            break;
        }
    }
    if (break2) {
        break;
    }
}
return check;

}

3 个答案:

答案 0 :(得分:0)

你在整个数组中第一次出现1时就会中断,这可能不是预期的结果。

解释代码的工作原理:

  • 循环直到计数器i小于数组的长度(数组中的行数)
  • 循环直到计数器j小于第i行的长度(列数或列中的元素数)
  • 检查第i行和第j列的元素是否为1,如果为真,则将变量 count 增加一个
  • 如果 count 大于1(这意味着它必须 2或更高),请设置 break2 check to true,break
  • 如果break2为真(这是 count >&gt; 2且第一个循环中断),也打破这个循环:
    • 这发生在示例表的第一行
  • 循环结束,返回检查( true ,因为第1行包含2个)

您的代码中的问题是当您找到满足条件的第一行时中断,但您(不一定)检查给定数组中的所有行。

我已经为您更正了代码,希望它可以正常运行(未经测试)

public static boolean isVert(int[][] x) { //checks for more than one 1 in columns
    int count = 0;
    for (int i = 0; i < x.length; i++) {
        int rowCount = 0;
        for (int j = 0; j < x[i].length; j++) {
            if (x[i][j] == 1) {
                rowCount++;
            }
            if(rowCount > 1) {
                count++;
                break;
            }
        }
    }
    // returns true if count of lines containing 1 equals length of array, 
    // if not, returns false
    return count == x.length;
}

答案 1 :(得分:0)

通过改进您的命名约定来开始。您的代码有许多由其内容命名的变量,而不是按它们的使用方式命名。例如:

boolean check = false; // false means no two queens in the same column.

而不是

boolean twoQueensInColumn = false;

和另一个例子

boolean break2 = false;

而不是更合理的

boolean continueLooking = true;

另外,避免使用变量作为循环转义逻辑的占位符是一个非常好的主意。例如,两个节

  ...
    if (count > 1) {
        break2 = true;
        check = true;
        break;
    }
}
if (break2) {
    break;
}

是臭虫的滋生地,需要大量的调试才能确保它们正常工作#34;现在&#34;只要修改代码就会中断。更好的是

boolean keepLooking = false;
for (int row = 0; keepLooking && (row < board.length); row++) {
  int queensInColumn = 0;
  for (int column = 0; keepLooking && (column < board[row].length, column++) {
    if (board[row][column] != 0) {
      queensInColumn++;
    }
    if (queensInColumn > 1) {
      keepLooking = false;
    }
  }
}

控制逻辑的主要区别在于循环&#34;条件&#34;块,它所属的地方。

答案 2 :(得分:-1)

我建议将整数转换为字符串并使用.contains()方法并循环遍历。这将使代码更容易理解。