Java深度克隆包含ArrayLists

时间:2017-05-23 11:50:06

标签: java arraylist cloning

我有一个名为Board的类,其中包含以下内容

public class Board  {

protected Piece[][] GameBoard = new Piece[8][8];
ArrayList<Move> BlackBoardmoves = new ArrayList<Move>();
ArrayList <Move> WhiteBoardmoves = new ArrayList<Move>();

我想创建一个全新的Board对象,它有2个完全独立的ArrayLists  我已经阅读了几天如何做这个,我尝试了各种方法,如实现克隆或序列化。 我已经读过克隆接口坏了,使用serializable会慢得多,所以我决定编写自己的复制方法

void copy(Board c)
{


for(int i =0; i<8; i++)  
{
for(int j=0; j<8; j++)
{
    this.GameBoard[i][j] = c.GameBoard[i][j];
}
}

for(int i=0 ;i<c.BlackBoardmoves.size(); i++)
{
this.BlackBoardmoves.add(c.BlackBoardmoves.get(i));
}

for(int i=0 ;i<c.WhiteBoardmoves.size(); i++)
{
this.WhiteBoardmoves.add(c.WhiteBoardmoves.get(i));
}
}

创建每个新对象时我目前正在做的是

Board obj2 = new Board();
obj2.copy(obj1);

这是我项目的一小部分,所以我已经坚持了好几天,真的花不了多少时间坚持这个。非常感谢你:))

3 个答案:

答案 0 :(得分:1)

首先,我建议让MovePiece个对象不可变。使用这种方法,您只需要在没有深度克隆的情况下复制这些对象的引用。

private static <T> void copy2DArray(T[][] to, T[][] from) {
    for (int i = 0; i < to.length; i++)
        for (int j = 0; j < to[i].length; j++) {
            to[i][j] = from[i][j];
        }
}

void copy(Board c) {
    copy2DArray<Piece>(this.GameBoard, c.GameBoard);
    this.BlackBoardmoves = new ArrayList(c.BlackBoardmoves);
    this.WhiteBoardmoves = new ArrayList(c.WhiteBoardmoves);
}

答案 1 :(得分:0)

你到底想要做什么? 您希望副本有多深? 您只是将旧列表的内容复制到新列表中,这可能(对于正确的深层复制)不是您想要的。 你也是用一种效率很低的方法做的,为什么不使用List类的“addAll”方法呢?

但是你可能也希望创建列表条目的副本,也许比这更深...... 由于您未在此处说明您的要求,因此无法确定。

答案 2 :(得分:0)

在Board类中,您可以放置​​将返回复制对象的方法,但是您需要适当的构造函数。您还必须在Piece类中添加相同的方法来深入复制数组中的每个对象。

Board(Object[][] GameBoard, ArrayList<Object> BlackBoardObjects, ArrayList <Object> WhiteBoardObjects){
    this.GameBoard = GameBoard;
    this.BlackBoardObjects = BlackBoardObjects;
    this.WhiteBoardObjects = WhiteBoardObjects;
}

public Board getCopy(){
    for(int i = 0; i < GameBoard.length; i++){
        for(int j = 0; j < GameBoard[0].length; j++){
            GameBoardCopy[i][j] = GameBoard[i][j].getCopy();
        }
    }
    ArrayList<Move> BlackBoardObjectsCopy = new ArrayList<Move>(BlackBoardObjects);
    ArrayList <Move> WhiteBoardObjectsCopy = new ArrayList<Move>(WhiteBoardObjects);
    return new Board(GameBoard, BlackBoardObjectsCopy, WhiteBoardObjectsCopy);
}