我正在编写一个'Sudoku'程序,我需要编写一个方法来检查用户想要插入某个单元格的数字是否已包含在行,列或区域中。我的代码看起来像这样(我此时只检查行的数字,setNumber返回一个布尔值,指示是否可以插入数字):
public boolean setNumber(int row, int column, int number) {
if (this.isEmpty(row, column)) {
if (!this.rowContains(row, number)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
private boolean rowContains(int row, int number) {
for (int i=0; i < this.cells[row].length; i++) {
if (this.cells[row][i].getNumber() == number) {
return true;
}
}
return false;
}
现在,可以多次插入相同的数字,所以显然rowContains总是返回false,但为什么呢?
答案 0 :(得分:0)
您的代码段看起来应该对我有用。
旧的println调试应该是你的救星。只需将语句放入代码中,即可看到发生了什么(例如:)
private boolean rowContains(int row, int number) {
for (int i=0; i < this.cells[row].length; i++) {
if (this.cells[row][i].getNumber() == number) {
System.err.println("Row " + row + " contains target number " + number + " in cell " + i);
return true;
}
}
System.err.println("Row " + row + " does not contain target number " + number);
return false;
}
这不会解决你的问题,但它可以让你更好地了解你的期望被无效的地方。
编辑:我刚看了你的代码,看看是否有什么东西跳出来 - 它没有(我怀疑你的问题在别处 - 你确定你实际上是设置每次通话的号码?)。但是,我注意到的一件事是成语:if (condition)
return true;
else
return false;
这几乎在各个方面都更好。
return condition;
做事“慢速的方式”往往被认为(无论好坏)sign of an inexperienced developer。
答案 1 :(得分:0)
如果setNumber
不是canSetNumner
的用词不当,我希望它包含
cells[row][column].setNumber(number);
之前的
行
return true;
答案 2 :(得分:0)
setNumber不是一个非常好的名称(例如将其命名为checkNumber或canSetNumber)。 'set'应该用于有副作用的方法(在对象中设置一个值)。
你应该确保实际设置了单元格数组中的数字,这可能是你可以在同一行中多次设置的原因。