我该如何克隆嵌套ArrayList?

时间:2018-04-27 19:58:17

标签: java arraylist nested bluej cloning

我需要编写一个方法来克隆嵌套的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>的元素?

3 个答案:

答案 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深层对象克隆。