我在分配对象时遇到问题,该对象会生成一个引用副本,用于更改原始对象中的值。
这是我的 原始对象
>>> value = [1, 2, 3, 4]
>>> ''.join(['{:02x}'.format(x) for x in value])
'01020304'
在deque数据结构中推送我的根后,我在 tmp变量
中检索它Node root = new Node();
root.filingState("input.txt");
之后,我希望我的tmp变量应用所有运算符(向上,向下,向左,向右,哪些都是可能的)并检查最佳结果。
Node tmp = deque.pop();
运营商职能
if ( !tmp.goalTest(goal) ) {
if ( tmp.ifDown() ) {
if ( !visited[tmp.getX()+1][tmp.getY()] ) {
newDown = new Node(tmp);
newDown.moveDown();
} else newDown = null;
} // #EndOfDown!
if ( tmp.ifUp() ) {
if ( !visited[tmp.getX()-1][tmp.getY()] ) {
newUp = new Node(tmp);
newUp.moveUp();
} else newUp = null;
} // #EndOfUp!
if ( tmp.ifLeft() ) {
if ( !visited[tmp.getX()][tmp.getY()-1] ) {
newLeft = new Node(tmp);
newLeft.moveLeft();
} else newLeft = null;
} // #EndOfMoveLeft!
if ( tmp.ifRight() ) {
if ( !visited[tmp.getX()][tmp.getY()+1] ) {
newRight = new Node(tmp);
newRight.moveRight();
} else newRight = null;
} // #EndOfMoveRight!
} else break;
newDown第一次迭代失败,因为我的其他节点没有通过条件来满足条件。
在我的第一个newUp应用其运算符后,它也会更改tmp节点。允许newLeft,newRight将运算符应用于新的tmp节点值。
类 Node.java
public boolean ifUp ( ) { return y_blank-1 >= 0; }
public boolean ifDown ( ) { return y_blank+1 <= 4; }
public boolean ifLeft ( ) { return x_blank-1 >= 0; }
public boolean ifRight ( ) { return x_blank+1 <= 4; }
/* Movement functions
Allows a user to move his blank on board
*/
public void moveUp ( ) {
board[y_blank][x_blank] = board[y_blank-1][x_blank];
board[y_blank-1][x_blank] = 'B';
y_blank -= 1;
} // #EndOfMoveUp!
public void moveLeft ( ) {
board[y_blank][x_blank] = board[y_blank][x_blank-1];
board[y_blank][x_blank-1] = 'B';
x_blank -= 1;
} // #EndOfMoveLeft!
public void moveRight ( ) {
board[y_blank][x_blank] = board[y_blank][x_blank+1];
board[y_blank][x_blank+1] = 'B';
x_blank += 1;
} // #EndOfMoveRight!
public void moveDown ( ) {
board[y_blank][x_blank] = board[y_blank+1][x_blank];
board[y_blank+1][x_blank] = 'B';
y_blank += 1;
} // #EndOfMoveDown!
我尝试创建一个复制构造函数,但没有解决问题。
复制构造函数
private char[][] board;
private int x_blank = -1;
private int y_blank = -1;
private Node parent = null;
private Node up = null;
private Node left = null;
private Node right = null;
private Node down = null;
/* Constructor
Allocates board to a 5x5 2D Array
*/
public Node ( ) { board = new char[5][5]; }
所以我的问题是,如何创建一个可以保存其他Object的值的Object,但是当我在新创建的对象上应用运算符时,它不会改变原始Object的值
答案 0 :(得分:1)
您的复制构造函数不会自动用于将该对象的实例赋值给新变量。在Java中,对象分配是通过引用来实现的。您需要在赋值中明确使用复制构造函数:
Node tmp = new Node(deque.pop());
答案 1 :(得分:0)
我认为最好的方法是实现一个克隆函数,它将创建一个具有相同值的新对象,然后你就不会改变原始对象的值。
例如:
clone(Node mynode){
return new Node(mynode.getValue());
}