我需要编写一个方法来克隆嵌套的ArrayList
。
嵌套ArrayList
看起来像这样:
ArrayList<ArrayList<Ship>> theSea = new ArrayList<ArrayList<Ship>>();
我想将其复制到克隆:
ArrayList<ArrayList<Ship>> seaClone = new ArrayList<ArrayList<Ship>>();
我试过迭代它并复制列表:
for(int i = 0; i < theSea.size(); i++){
seaClone.add(theSea.get(i));
}
但是,这并不能克隆嵌套ArrayList<Ship>
的元素,而只是复制对它的引用。
我应该如何克隆嵌套ArrayList<Ship>
的元素?
答案 0 :(得分:0)
但是,这不会克隆嵌套ArrayList的元素 而只是复制一个对它的引用。
因为它实际上就是你正在做的事情:你在新列表中添加现有对象的引用
因此,在新的List
中添加元素时,不是为每个克隆的子列表创建一个新的嵌套ArrayList,而是创建新的Ship对象。
您可以在Ship
中定义复制构造函数,例如:
public Ship(Ship model){
foo = model.foo;
bar = model.bar;
}
你可以写:
for(List<Ship> list : theSea){
List<Ship> currentList = new ArrayList<>();
for(Ship ship : list){
currentList.add(new Ship(ship));
}
clone.add(currentList);
}
答案 1 :(得分:0)
假设Ship
个对象是可复制的:
List<List<Ship>> clone = theSea.stream()
.map(l -> l.stream().map(s -> (Ship)s.clone()).collect(toList()))
.collect(toList());
答案 2 :(得分:0)
类似的东西:
ArrayList<ArrayList<Ship>> listCopy = new ArrayList<>();
for (int i=0; i<list.size(); i++) {
ArrayList<Ship> newList = new ArrayList<>();
for (int j=0; j<list.get(i).size(); j++) {
newList.add(new Ship(list.get(i).get(j)));
}
listCopy.add(newList);
}
请注意以下一行:newList.add(new Ship(list.get(i).get(j)));
您需要将对象传递给构造函数并从那里复制所有属性,否则您将只创建对同一个类的引用。
如果您的船舶类与该任务中的许多其他对象复杂可能很困难,您可以使用序列化为json的工具,然后恢复为对象或使用java深层对象克隆。