Как скопировать содержимое одного ArrayList в другой?



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



ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();


теперь проблема с этим, конечно, в том, что myObject на самом деле просто указывает на myTempObject, и так как myTempObject очищается, так же как и myObject.



как мне сохранить значения из myTempObject на myObject С помощью java?

741   10  

10 ответов:

Вы можете использовать такой трюк:

myObject = new ArrayList<Object>(myTempObject);

или использовать

myObject = (ArrayList<Object>)myTempObject.clone();

Вы можете получить некоторую информацию о методе clone ()здесь

но вы должны помнить, что все эти способы дадут вам копию список, не все его элементы. Поэтому, если вы измените один из элементов в скопированном списке, он также будет изменен в исходном списке.

originalArrayList. addAll(copyArrayList);

Обратите Внимание: при использовании метода addAll() для копирования содержимое обоих списков массивов (originalArrayList и copyArrayList) ссылается на одни и те же объекты или содержимое. Поэтому, если вы измените любой из них, другой также отразит то же самое изменение.

Если вы не хотите этого, вам нужно скопировать каждый элемент из originalArrayList в copyArrayList, например, используя for или while петля.

нет никаких неявных копий, сделанных в java через оператор присваивания. Переменные содержат ссылочное значение (указатель) и при использовании = вы только справляетесь с этим значением.

для того, чтобы сохранить содержание myTempObject вам нужно будет сделать его копию.

это можно сделать, создав новый ArrayList С помощью конструктора, который принимает другой ArrayList:

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

Edit: как Богема указывает в комментариях ниже, это то, что вы спрашиваете? Делая выше, оба ArrayLists (myTempObject и myObject) будет содержать ссылки на то же самое объекты. Если вы действительно хотите новый список, содержащий новые копии объектов, содержащихся в myTempObject тогда вам нужно будет сделать копию каждого отдельного объекта в оригинале ArrayList

наткнулся на это, столкнувшись с той же проблемой сам.

говоря arraylist1 = arraylist2 устанавливает их обоих, чтобы указать на одно и то же место, так что если вы измените либо изменения данных и, таким образом, оба списка всегда остаются одинаковыми.

чтобы скопировать значения в независимый список, я просто использовал foreach для копирования содержимого:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

заполните list1 так, как вы сейчас находитесь.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}

Supopose вы хотите скопировать oldList в новый объект ArrayList с именем newList

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

эти два списка являются независимыми, изменения в одном не отражаются на другом.

вам нужно clone() отдельный объект. Constructor и другие методы выполняют мелкое копирование. Вы можете попробовать сборники.копировать метод.

давайте попробуем пример

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

печати выход ниже

один
Два
Три
Четыре
Пять
Шесть

мы также можем сделать с помощью clone () метод, который используется для создания точной копии

для этого попробовать вы можете попробовать как

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**

простой способ сделать глубокую копию списка, чтобы добавить все элементы из одного списка в другой список.

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

теперь, если вы внесете какие-либо изменения в originalList, это не повлияет на duplicateList.

чтобы скопировать один список в другой список, u может использовать метод, называемый Коллекция.копия (myObject myTempObject).теперь после выполнения этих строк кода u может видеть все значения списка в myObject.

копирование одного списка во второй довольно просто , вы можете сделать это, как показано ниже: -

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);

Comments

    Ничего не найдено.