我有一个名为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);
这是我项目的一小部分,所以我已经坚持了好几天,真的花不了多少时间坚持这个。非常感谢你:))
答案 0 :(得分:1)
首先,我建议让Move
和Piece
个对象不可变。使用这种方法,您只需要在没有深度克隆的情况下复制这些对象的引用。
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);
}