抱歉,标题不是很容易理解,但是我的英语没有帮助。我是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()方法(如您所见)解决它,但是它没有用。

这是怎么回事?我想念什么?非常感谢你。

最佳答案

如果尚未在clone()中实现SudokuBoard,则可能是在clone()上定义了默认的Object,它不执行对象的深层复制。有关说明,请参见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();
        }
    }
}

10-06 08:54