Java Deepcloning объект, который содержит ArrayLists
У меня есть класс под названием 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 ответа
Внутри класса 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);
}
Прежде всего я бы предложил сделать 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);
}
Что именно ты здесь пытаешься сделать? Как глубоко вы хотите, чтобы копия была? Вы просто копируете содержимое старого списка в новый, что, вероятно (для правильной глубокой копии) не то, что вам нужно. Вы также делаете это довольно неэффективным методом, почему бы вместо этого не использовать метод addAll класса List?
Но вы, вероятно, хотите также создать копии записей списка, и, возможно, глубже этого... Что невозможно определить, поскольку вы не указали здесь свои требования.