方法更改参数

时间:2015-07-02 17:51:16

标签: java matrix methods artificial-intelligence puzzle

方法(Mover)属于一个Estado类,它描述了一个滑动拼图的状态,它带有一个矩阵表(板)和一个跟踪空位的变量hueco(空洞)。问题是函数改变了原始Estado的值,并且它不应该。有人可以告诉我,我做错了什么吗?

public class Estado {
public int dim;
public int tablero[][];
public int hueco[]= new int[2];
public Estado(int dim,int tablero[][],hueco){
    this.dim=dim;
    this.tablero=tablero;
    this.hueco=hueco;

}
public Estado(){}

//moves empty tile to one of 4 option(up,down,right,left)
(up,down,right,left)
//
public Estado mover(String direccion,Estado estado){
    Estado sig= new Estado();        
    sig.tablero=estado.tablero;
    sig.dim=estado.dim;
    sig.hueco=estado.hueco;
    estado.mostrarTablero();
    switch (direccion){
        case "up":                
            sig.tablero[estado.hueco[0]][estado.hueco[1]]=sig.tablero[estado.hueco[0]+1][estado.hueco[1]];
            sig.tablero[estado.hueco[0]+1][estado.hueco[1]]=0;
            sig.hueco[0]=estado.hueco[0]+1;
            break;               
        default:
//cases "down,right and left" omitted, very similar to "up"
            break;
    }               
    return sig;

}                                        
}

1 个答案:

答案 0 :(得分:1)

问题是变量sig指向参数tablero的相同数组huecoestado,因为这些语句:

sig.tablero=estado.tablero;
sig.hueco=estado.hueco;

当您调用mover方法时,Java会传递“指针”的副本,但不会传输阵列结构的平面副本(copia plana)。

也许您更喜欢了解主题按值传递传递引用以及制作平面副本的含义。

编辑: 我从Programmers StackExchange那里得到这个,这可以帮助你理解:

  

Java是按值传递的。可以把它想象成像C这样的指针语言,指针(内存地址)的值被传递,因此您可以引用同一个对象。基元的内部存储方式与对象不同,因此当传递基元的值时,它是内容,而不是指针。