Создание глубокой копии многоуровневого списка? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть:

ArrayList<ArrayList<ArrayList<Task>>> optimalPaths = new ArrayList<ArrayList<ArrayList<Task>>>();

Я хотел бы создать глубокую копию оптимальных путей. Сама копия не должна содержать ссылок на оптимальные пути. Будет ли работать следующий код?

ArrayList<ArrayList<ArrayList<Task>>> altPaths = new ArrayList<ArrayList<ArrayList<Task>>>();

for (ArrayList<ArrayList<Task>> e : optimalPaths){
    altPaths.add((ArrayList<ArrayList<Task>>) e.clone()); // Create deep copy of optimalPaths
}

Я не уверен, есть ли еще ссылки в altPaths на каком-то уровне.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Вы можете использовать копирование сериализацией и десериализацией, если в классе Task нет переходных полей, которые вы хотите скопировать:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(optimalPaths);

ByteArrayInputStream bis = new   ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
ArrayList<ArrayList<ArrayList<Task>>> copied = (ArrayList<ArrayList<ArrayList<Task>>>) in.readObject();

или используйте для этого внешний класс: SerializationUtils из Apache Commons

0 голосов
/ 03 ноября 2019

Вы можете сделать это самостоятельно

for (ArrayList<ArrayList<Task>> outer : optimalPaths) {
    ArrayList<ArrayList<Task>> newOuter = new ArrayList<>();
    for (ArrayList<Task> inner : outer) {
        ArrayList<Task> newInner = new ArrayList<>();
        for (Task task: inner) {
            newInner.add((Task) task.clone());
        }
        newOuter.add(newInner);
    }
    altPaths.add(newOuter);
}
...