具有矩阵(Java)的对象的深拷贝(克隆)

我在深拷贝时遇到了一些麻烦。 我有这个java项目,国际象棋,我需要使用克隆()方法,因为我需要尝试新的配置,而无需更改电路板。

    Board scacchiera = new Board();
    Initialization(scacchiera);
    Board clone = scacchiera.clone();
    System.out.println(scacchiera.toString());
    System.out.println(clone.toString());

我创建了一个对象,scacchiera,然后我克隆它。 我认为我已经正确完成了一个深层复制,但是当我在scacchiera中更改某些内容时,克隆也会发生更改。 在对象板中:

public class Board implements Cloneable{
//TODO
//rivedere se check e checkmate public o private;
//se private, costruire get e set;

public Pedine[][] board;
public boolean check;
public boolean checkmate;
//creating 2 lists for all the pieces; Neri=black, Bianchi=White
public ArrayList<Pedine> Neri;
public ArrayList<Pedine> Bianchi;

public Board(){

    this.board = new Pedine [8][8];
    this.check = false;
    this.checkmate = false;
    this.Neri = new ArrayList<Pedine>();
    this.Bianchi = new ArrayList<Pedine>();


}

...

@Override
public Board clone() throws CloneNotSupportedException{

    Board cloned = (Board) super.clone();
    cloned.board = (Pedine[][]) board.clone();
    return cloned;
}

我有这种双倍的Pedine,我也必须克隆它,所以我这样做:

public class Pedine implements Cloneable{

private int x;
private int y;
private Piece pezzo;
private Colour colore;

...

@Override
public Pedine clone() throws CloneNotSupportedException{

    return (Pedine) super.clone();

}

为什么它不起作用?

我也试过这个代码,但它不起作用。

@Override
public Board clone() throws CloneNotSupportedException{

    Board cloned = (Board) super.clone();
    cloned.board = (Pedine[][]) board.clone();
    for (int i=0; i<8; i++)
        for(int j=0; j<8; j++){
            cloned.board[i][j] = board[i][j].clone();
        }
    return cloned;
}

(Pedine扩展对象)


正如sharonbn所指出的那样,这个问题存在于双数组中。 虽然您可以用双循环手动克隆它,但您的国际象棋引擎将遭受性能损失:您将克隆大量的电路板,并且您可以通过使它们更容易复制而受益。

一种选择是使用平面阵列和一些巧妙的寻址来加快速度:

private Piece[] board; // 64 Pieces in there
public Piece at(col, row) {
    if (row < 0 || row >= 8 || col < 0 || col >= 8) return null;
    return board[col + row*8];
}

现在,不是访问您at(col, row)使用的board[row][col] 。 复制和创建电路板要容易得多:

board = other.board.clone(); 

...现在应该按预期工作。

我也强烈建议拥有一成不变的作品,不要有任何国家的信息。 例如,您当前的作品有xy字段。 他们需要那些什么? 你应该只在移动他们时告诉他们他们的实际位置; 这样,你根本不需要克隆碎片 - 因为所有的棋子都是一样的,而且实际上黑色棋子可以使用相同的“黑色棋子”。


如此处所解释的,多维数组的深度克隆应该被自定义编码

链接地址: http://www.djcxy.com/p/6973.html

上一篇: Deep copy (clone) of an object with matrix (Java)

下一篇: Object is cloned , but static references still exists?