Как мне клонировать гнездо ArrayList? - PullRequest
0 голосов
/ 27 апреля 2018

Мне нужно написать метод для клонирования вложенного 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 голосов
/ 27 апреля 2018

Предполагая, что Ship объекты являются клонируемыми:

List<List<Ship>> clone = theSea.stream()
    .map(l -> l.stream().map(s -> (Ship)s.clone()).collect(toList()))
    .collect(toList());
0 голосов
/ 27 апреля 2018

Что-то вроде:

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.

0 голосов
/ 27 апреля 2018

Однако это не клонирует элементы вложенного ArrayList и вместо этого просто копирует ссылку на него.

Потому что это действительно то, что вы делаете: вы добавляете ссылку на существующие объекты в новый список.
Поэтому вместо этого создайте новый вложенный ArrayList для каждого клонированного подсписка и создайте новые объекты Ship при добавлении элементов в новые List s.
Вы можете определить конструктор копирования в 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);
  }
...