2013-03-31 56 views
1

對不起,標題不是很理解,但我的英語不起作用。我是java中的一名新程序員,儘管已經閱讀過參數如何工作,但我並不真正瞭解發生了什麼。對對象所做的任何更改也會更改當前對象

sudokuBoard alter = new sudokuBoard(); 
this.createRandomSudokuBoard(); 
alter.setBoardFromArray(this.getBoard().clone()); 

(...) 

for(int i = 0; i < 81; i++) { 
    alter.clearCell(positionListonX[i], positionListonY[i]); <<<<<<<<<<<<< Here 
    if(alter.numberOfSolutions(2) < 2) { 
     this.clearCell(positionListonX[i], positionListonY[i]); 
     alter.setBoardFromArray(this.getBoard().clone()); 
    } else { 
     alter.setBoardFromArray(this.getBoard().clone()); 
    } 
} 

會發生什麼情況的是,在指定的行,調用方法的對象alter也修改當前對象(本)的clearCell。在最後一次絕望的嘗試中,我試圖用clone()方法解決它(如您所見),但它沒有奏效。

發生了什麼事?我錯過了什麼?非常感謝你。

回答

1

如果您尚未在SudokuBoard中實施clone(),那麼您可能會收到Object上定義的默認clone(),該值不會執行對象的深層複製。有關說明,請參閱Deep Copy。如果你真的想在你的alter板的一個完全獨立的情況下,你需要做這樣的事情:

class SudokuBoard 
{ 
    public void setBoard(SudokuBoard other) 
    { 
     for(int i = 0; i < 81; i++) 
     { 
      this.positionListonX[i] = other.positionListonX[i]; 
      this.positionListonY[i] = other.positionListonY[i]; 
     } 
     // Copy any other properties 
    } 
} 

注意,如果在你的positionListonXpositionListonY數組的值不是原始類型,您還可以需要這些的深層副本。這實際上是一個拷貝構造函數,但我沒有給它簽名(public SudokuBoard(SudokuBoard other)),因爲我不知道SudokuBoard的其他內部。

這將有助於查看SudokuBoard類中定義的更多方法簽名,因此我們知道有哪些方法可用並可以理解它們的作用。

編輯

class SudokuBoard 
{ 
    public void setBoardFromArray(int[][] otherBoard) 
    { 
     for(int i = 0; i < otherBoard.length; i++) 
     { 
      // Clone the arrays that actually have the data 
      this.board[i] = otherBoard[i].clone(); 
     } 
    } 
} 
+0

現在我更好地理解它,非常感謝你。該類的代碼在這裏http://pastebin.com/fjCP7DQL它沒有完成,沒有記錄,也沒有完成。 – Adelaiglesia

+0

它看起來像你試圖保留一個副本,只有當你知道這個改變是好的時候纔對this.board進行修改。您將需要更新setBoardFromArray來執行逐個元素的副本,而不是僅分配數組。我相信你的'clone'調用不起作用,因爲你克隆了對另一個數組的引用,而不是數據本身。查看我編輯的'setBoardToArray',我認爲它會做你想做的事。 –