我正在写一个'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,但是为什么呢?
发布于 2009-11-03 22:23:04
如果setNumber不是对canSetNumner的错误描述,我希望它包含一个
cells[row][column].setNumber(number);属性之前的行。
return true;发布于 2009-11-03 22:11:15
在我看来,您的代码片段应该可以工作。
老的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。
发布于 2009-11-03 22:26:16
setNumber不是一个很好的名字(例如,我会将其命名为checkNumber或canSetNumber )。‘'set’应该用于有副作用的方法(在对象中设置值)。
你应该确保你实际设置了单元数组中的数字,这可能是为什么你可以在同一行中多次设置的原因。
https://stackoverflow.com/questions/1667430
复制相似问题