2009-11-03 58 views
0

我正在编写一个'Sudoku'程序,并且我需要编写一个方法来检查数字,用户想要插入某个单元格是否已包含在行,列或地区。我的代码看起来像这样(我只检查数量排在这一点上,setNumber返回一个布尔值,表示号码是否可以插入或不):Java 2dim迭代表

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

当rowContains返回false时,您将返回true,是否有意?看起来这可能是那里的问题? – Corazu 2009-11-03 13:58:03

+0

@Corazu:对我来说这听起来像是正确的行为 - 如果行*不包含数字,则插入成功(true)。 – 2009-11-03 14:08:46

+0

是的,在这方面是正确的。 – rize 2009-11-03 17:09:24

回答

0

如果setNumber不是canSetNumner名不副实我希望它包含

cells[row][column].setNumber(number); 

线只是

return true; 
+0

是的,我忘了实际设置单元格中的数字,如果它是合法的,因为我认为另一个类是这样做的,如果此方法返回true,但事实并非如此。 – rize 2009-11-06 11:42:43

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; 

做事的“速记方式”更倾向于认为(或好或坏)a sign of an inexperienced developer

+0

是的,所以它看起来,但它不:)可能是程序的其他部分失败。我会继续调试.. :) – rize 2009-11-03 17:10:47

0

setNumber之前是不是一个很好的名字(将其命名为checkNumber ,或canSetNumber,例如)。 'set'应该用于有副作用的方法(在对象中设置一个值)。

你应该确保你实际设置单元格数组中的数字,这可能是你为什么可以在同一行中设置好几次的原因。