抱歉,标题不是很容易理解,但是我的英语没有帮助。我是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
}
}
请注意,如果
positionListonX
和positionListonY
数组中的值不是原始类型,则还需要它们的深层副本。这实际上是一个复制构造函数,但是我没有给它签名(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();
}
}
}