2009-11-03 80 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'應該用於有副作用的方法(在對象中設置一個值)。

你應該確保你實際設置單元格數組中的數字,這可能是你爲什麼可以在同一行中設置好幾次的原因。