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());
    }
}

何が起こるかというと、示された行でclearCell、オブジェクトのメソッドを呼び出すとalter、現在のオブジェクト (this) も変更されます。最後の必死の試みで、メソッドを使用して解決しようとしましたclone()が (ご覧のとおり)、うまくいきませんでした。

どうしたの?私は何が欠けていますか?どうもありがとうございます。

4

1 に答える 1

1

で実装clone()していない場合は、オブジェクトのディープ コピーを実行しない、で定義されSudokuBoardたデフォルトを取得している可能性があります。説明については、ディープ コピーを参照してください。でボードの完全に別のインスタンスが実際に必要な場合は、次のようにする必要があります。clone()Objectalter

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
    }
}

positionListonXおよびpositionListonY配列の値がプリミティブ型でない場合は、それらのディープ コピーも必要になることに注意してください。これは事実上コピー コンストラクターですがpublic SudokuBoard( SudokuBoard other)、数独ボードの残りの内部構造がわからないため、その署名 ( ) は付けませんでした。

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();
        }
    }
}
于 2013-03-31T03:54:29.397 に答える