Как клонировать ArrayList и также клонировать его содержание?

Вместо того, чтобы использовать AsyncContext.start(Runnable), я использовал CompletableFuture.runAsync(Runnable), и он работал как ожидалось.

257
задан Lii 24 August 2016 в 06:01
поделиться

6 ответов

Необходимо будет выполнить итерации на объектах и клонировать их один за другим, помещая клоны в массив результата, когда Вы идете.

public static List<Dog> cloneList(List<Dog> list) {
    List<Dog> clone = new ArrayList<Dog>(list.size());
    for (Dog item : list) clone.add(item.clone());
    return clone;
}

Чтобы это работал, очевидно, необходимо будет получить Ваш Dog класс для реализации Cloneable соедините интерфейсом и переопределите clone() метод.

191
ответ дан gudok 23 November 2019 в 02:43
поделиться

Другие плакаты корректны: необходимо выполнить итерации списка и копии в новый список.

Однако... Если объекты в списке неизменны - Вы не должны клонировать их. Если Ваш объект будет иметь диаграмму составного объекта то - они должны будут быть неизменными также.

Другое преимущество неизменности - то, что они ориентированы на многопотоковое исполнение также.

0
ответ дан Fortyrunner 23 November 2019 в 02:43
поделиться

Необходимо будет клонироваться ArrayList вручную (путем итерации по нему и копирования каждого элемента в новое ArrayList), потому что clone() не сделает этого для Вас. Причина этого состоит в том, что объекты содержали в ArrayList может не реализовать Clonable самостоятельно.

Править:... и это точно, что делает код Varkhan.

2
ответ дан Lii 23 November 2019 в 02:43
поделиться

Я, лично, добавил бы конструктора к Собаке:

class Dog
{
    public Dog()
    { ... } // Regular constructor

    public Dog(Dog dog) {
        // Copy all the fields of Dog.
    }
}

Затем просто выполните итерации (как показано в ответе Varkhan):

public static List<Dog> cloneList(List<Dog> dogList) {
    List<Dog> clonedList = new ArrayList<Dog>(dogList.size());
    for (Dog dog : dogList) {
        clonedList.add(new Dog(dog));
    }
    return clonedList;
}

Я нахожу, что преимущество этого - Вы, не должны валять дурака с поврежденным материалом Cloneable в Java. Это также соответствует способу, которым Вы копируете наборы Java.

Другая опция могла состоять в том, чтобы записать Ваш собственный интерфейс ICloneable и использование это. Тем путем Вы могли записать общий метод для клонирования.

190
ответ дан cdmckay 23 November 2019 в 02:43
поделиться

Ниже обработанного для меня..

в Dog.java

public Class Dog{

private String a,b;

public Dog(){} //no args constructor

public Dog(Dog d){ // copy constructor
   this.a=d.a;
   this.b=d.b;
}

}

 -------------------------

 private List<Dog> createCopy(List<Dog> dogs) {
 List<Dog> newDogsList= new ArrayList<>();
 if (CollectionUtils.isNotEmpty(dogs)) {
 dogs.stream().forEach(dog-> newDogsList.add((Dog) SerializationUtils.clone(dog)));
 }
 return newDogsList;
 }

Здесь новый список, который был создан из createCopy метода, создается через SerializationUtils.clone (). Таким образом, любое изменение, внесенное в новый список, не будет влиять на исходный список

0
ответ дан 23 November 2019 в 02:43
поделиться

Я думаю, что текущий зеленый ответ плохой , почему вы можете спросить?

  • Это может потребовать добавления большого количества кода
  • Это требует, чтобы вы перечислили все списки для скопируйте и сделайте это

Способ сериализации тоже плох, imo, вам, возможно, придется добавить Serializable повсюду.

Итак, каково решение:

Библиотека глубокого клонирования Java Библиотека клонирования - это небольшая java-библиотека с открытым исходным кодом (лицензия apache), которая глубоко клонирует объекты. Объекты не обязательно должны реализовывать интерфейс Cloneable. Фактически, эта библиотека может клонировать ЛЮБЫЕ объекты Java. Его можно использовать, например, в реализациях кеширования, если вы не хотите, чтобы кэшированный объект изменялся или всякий раз, когда вы хотите создать глубокую копию объектов.

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

Проверьте это на https://github.com/kostaskougios/cloning

18
ответ дан 23 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: