原始3D阵列和更改副本时更改列表

时间:2015-02-05 06:24:21

标签: java jagged-arrays

我知道标题听起来有点奇怪,但让我试着解释一下。

我编写了一个小型状态机,我试图将盲搜索实现到最终状态(由用户决定)。到目前为止,我已经能够为编号为2x2的网格生成所有可能的状态。每个州都由此定义:

static List<State> states = new ArrayList<State>();

public class State {
    int info[][][];                             //Información del éstado (Número almacenado en x, y, z posición)
    HashMap<String, State> vecinos = new HashMap<String, State>();      //Lista de vecinos e instrucción para llegar a ellos desde el estado actual
    boolean valido;                             //Bit de validez
    boolean visitado;                           //Bit de visitado

    public State() {
        this.info = info;
        this.valido = true;
        this.visitado = false;
    }

    public boolean equals(State s) {
        boolean iguales = true;
        for (int i = 0; i < face; i++) {
            for (int j = 0; j < rows; j++) {
                for (int k = 0; k < cols; k++) {
                    if (this.info[i][j][k] != s.info[i][j][k])
                        iguales = false;
                }
            }
        }
        return iguales;
    }

    public String toString() {
        String ret = new String(" ");
        for (int i = 0; i < face; i++) {
            for (int j = 0; j < rows; j++) {
                ret = ret + "\n";
                for (int k = 0; k < cols; k++) {
                    ret = ret + " " + info[i][j][k] + " ";
                }
            }
        }
        return ret;

    }
}

现在,正如您所看到的,我在每个州内都有一个HashMap。这个HashMap是我应该用于盲目搜索的那个,但这是我的问题:

public State genSt(State estado, instrucciones inst) {
    State nxtSt = estado;
    int[][][] toswap = new int[face][rows][cols];
    int[] place0 = new int[3];

    switch (inst) {
        case arriba:
            boolean val = checkvalidity(estado, inst);
            if (val) {
                place0 = find0(estado);
                toswap = estado.info;
                int swap = estado.info[place0[0]][place0[1] + 1][place0[2]];

                toswap[place0[0]][place0[1]][place0[2]] = swap;
                toswap[place0[0]][place0[1] + 1][place0[2]] = 0;
                nxtSt.info=toswap;

                nxtSt = repeated(nxtSt);
                if (nxtSt != null) {
                    estado.vecinos.put("arriba", nxtSt);
                    nxtSt.vecinos.put("abajo", estado);
                    nxtSt.valido = true;
                    System.out.print("\n ARRIBA \n _________ \n" + nxtSt.toString());
                } else
                    System.out.print("\nREPEATED ARRIBA\n");
            } else return null;
            break;
...
default:
            System.out.print("Instrucción inválida");
    }
    //estado = nxtSt;

    return nxtSt;       //Regresa estado generado
}

但是当我更改nxtSt的值时,它也会更改estado的值,并且列表中的其余元素也会更改。所以每个人都有相同的hashmap,我无法进行搜索。

你知道我该如何解决这个问题吗?提前谢谢。

编辑:我试图为信息实现手动深层复制,但我认为我在更多行中也做了同样的事情,因为它不起作用。这是代码:

public int[][][] genNxSt(State original){
    curInfo = new int[face][rows][cols];

    for(int f =0; f<face;f++){
        for(int r=0; r<rows; r++){
            for(int c=0; c<cols; c++){
                curInfo[f][r][c] = original.info[f][r][c];
            }
        }
    }
    return curInfo;
}

0 个答案:

没有答案