Як скопіювати вміст одного ArrayList в інший?


85

У мене є деякі структури даних, і я хотів би використовувати одну як тимчасову, а іншу як не тимчасову.

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?


Можна використовувати List.addAll. Але якщо вам потрібно зберегти всі об'єкти, тоді очищення тимчасового списку насправді не призведе до очищення великої кількості пам'яті. Оскільки ви намагаєтеся лише очистити посилання, наскільки об'єкти ви намагаєтеся зберегти.
Bhesh Gurung

Наскільки мені відомо, ця відповідь все ще діє: stackoverflow.com/questions/715650/…
додому

2
Важко інтерпретувати, чого ви насправді намагаєтесь досягти. Вам потрібно пояснити свою ситуацію.
Bhesh Gurung

Відповіді:


138

Ви можете скористатися таким трюком:

myObject = new ArrayList<Object>(myTempObject);

або використовувати

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

Ви можете отримати деяку інформацію про метод clone () тут

Але слід пам’ятати, що всі ці способи дадуть вам копію вашого списку , а не всіх його елементів. Отже, якщо ви зміните один із елементів у скопійованому списку, він також буде змінений у вашому початковому списку.


7
присвоювати за значенням у Java - це те, що зарезервовано для примітивних типів (int, byte, char тощо) та літералів. Якщо ви явно не скажете Java копіювати щось, що походить від Objectнього, ми завжди призначатимемо за посиланням. До речі clone(), це неглибока копія і не буде копіювати вміщені, Objectsа скоріше посилання на них. Якщо ви хочете , щоб зробити глибокий-копія поглянути на: stackoverflow.com/questions/64036 / ...
PeterT

@PeterT - Java - це лише виклик і призначення за значенням. Непримітивні змінні типу містять посилальні значення, які присвоюються або передаються.
Брайан Роуч

Будь ласка, чому я не можу oldList = newList?
X09,

2
@ X09 oldList = newList скопіює посилання на newList в oldList, будь-які зміни в newList також будуть відображені в oldList. Це не передбачувана поведінка.
Sreekanth Karumanaghat

42

originalArrayList. addAll (copyArrayList);

Зверніть увагу : При використанні методу addAll () для копіювання вміст обох списків масивів (originalArrayList та copyArrayList) посилається на ті самі об’єкти чи вміст. Отже, якщо ви модифікуєте будь-який з них, інший також відображатиме ті самі зміни.

Якщо ви цього не хочете, вам потрібно скопіювати кожен елемент з originalArrayList в copyArrayList, наприклад, використовуючи цикл for або while.


1
Як зупинити вплив на інший список, чи є якийсь інший спосіб, з яким ми можемо з цим впоратися
Махеш,

@Mahesh - передати цей stackoverflow.com/questions/715650 / ...
KrishPrabakar

17

Немає неявних копій, зроблених у Java за допомогою оператора присвоєння. Змінні містять посилальне значення (покажчик), і коли ви використовуєте, =ви лише справляєтесь із цим значенням.

Для збереження вмісту myTempObjectвам потрібно буде зробити його копію.

Це можна зробити, створивши новий ArrayListза допомогою конструктора, який бере інший ArrayList:

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

Редагувати: Як зазначає Богемський у коментарях нижче, це те, про що ви запитуєте? Виконуючи вищезазначене, обидва ArrayLists ( myTempObjectі myObject) міститимуть посилання на однакові об’єкти. Якщо ви насправді хочете новий список, який містить нові копії об’єктів, що містяться в, myTempObjectтоді вам потрібно буде зробити копію кожного окремого об’єкта в оригіналіArrayList


1
У цьому випадку це буде добре працювати, оскільки заклик clear()до ArrayList myTempObjectнього не впливатиме на предмети, що містяться в терині. Якщо він хотів отримати нові копії об’єктів, що містяться у списку, це вже інша історія, але це не те, що я трактував це запитання як запитання.
Брайан Роуч

Ви знаєте, я думаю, що ви маєте рацію. Я неправильно інтерпретував питання. Він переживав, що очищення одного очистить інше. Коментар видалено.
Чеська

@Bohemian - Я думаю, це був справедливий коментар, і я відредагував свою публікацію, щоб відобразити це. Я не вважав, що це може бути наміром ОП під час читання його запитання.
Брайан Роуч

@BrianRoach Як зробити копію ArrayList всередині ArrayList.
Арун

8

Я зіткнувся з цим, стикаючись із цим самим питанням.

Вимовляючи arraylist1 = arraylist2 встановлює їх обох, щоб вони вказували на одне і те ж місце, тому, якщо ви змінюєте будь-які дані, і, таким чином, обидва списки завжди залишаються однаковими.

Щоб скопіювати значення в незалежний список, я щойно використав foreach для копіювання вмісту:

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

заповнити list1 будь-яким способом, яким ти є зараз.

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

4

Припустимо, ви хочете скопіювати oldList у новий об'єкт ArrayList, який називається newList

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

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

Ці два списки незалежно, зміни одного не відображаються в іншому.


4

Давайте спробуємо приклад

     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());
                }**

3

Вам потрібно до clone()окремого об'єкта. Constructorта інші методи виконують неглибоке копіювання. Ви можете спробувати метод Collections.copy .


Collections.copy зламаний. По-перше, це вводить в оману, кажучи, що він копіює елементи, тоді як посилається на них лише в новому списку. По-друге, вам потрібно вже мати список призначення, розмір якого не нижче вихідного списку ...
ACV

1

Прямий спосіб зробити глибоку копію оригінального списку - це додати всі елементи з одного списку в інший.

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

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

Тепер, якщо ви внесете будь-які зміни до originalList, це не вплине на duplicateList.


0

щоб скопіювати один список в інший список, ви можете скористатися методом, який називається Collection.copy (myObject myTempObject). Тепер, після виконання цього рядка коду, ви можете побачити всі значення списку в myObject.


0

Копіювати один список у другий досить просто, ви можете зробити це, як показано нижче: -

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

0

Ось обхідний спосіб для копіювання всіх об’єктів з одного arrayList в інший:

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

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subList призначений для повернення Списку з діапазоном даних. щоб ви могли скопіювати весь arrayList або його частину.


0

Припустимо, у вас є два аргументи типу String. Люблю

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

Тепер ми повинні скопіювати дані другого масиву до першого списку елементів, як це,

firstArrayList = new ArrayList<>(secondArrayList );

Готово !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.