对不起,标题不是很容易理解,但我的英语没有帮助。我是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()
方法(正如您所见)解决它,但它没有用。
发生了什么?我错过了什么?非常感谢你。
答案 0 :(得分:1)
如果您未在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();
}
}
}