Jak skopiować zawartość jednej ArrayList do innej?

85

Mam pewne struktury danych i chciałbym użyć jednej jako tymczasowej, a innej jako nie tymczasowej.

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

teraz problem z tym oczywiście polega na tym, myObjectże tak naprawdę tylko wskazuje myTempObject, więc raz myTempObjectzostanie wyczyszczony, tak jest myObject.

Jak mogę zachować wartości od myTempObjectw myObjectużyciu Java?

CQM
źródło
Możesz użyć List.addAll. Ale jeśli chcesz zachować wszystkie obiekty, wyczyszczenie listy tymczasowej nie spowoduje wyczyszczenia całej pamięci. Ponieważ próbujesz tylko wyczyścić odniesienia, jeśli chodzi o obiekty, które próbujesz je zachować.
Bhesh Gurung
O ile wiem, ta odpowiedź jest nadal aktualna: stackoverflow.com/questions/715650/…
home
2
Trudno jest zinterpretować to, co naprawdę próbujesz osiągnąć. Musisz wyjaśnić swoją sytuację.
Bhesh Gurung,

Odpowiedzi:

138

Możesz użyć takiej sztuczki:

myObject = new ArrayList<Object>(myTempObject);

albo użyj

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

Możesz uzyskać więcej informacji o metodzie clone () tutaj

Pamiętaj jednak, że wszystkie te sposoby dają kopię Twojej Listy , a nie wszystkie jej elementy. Więc jeśli zmienisz jeden z elementów na skopiowanej liście, zostanie on również zmieniony na oryginalnej liście.

Artem
źródło
7
przypisywanie według wartości w Javie jest czymś zarezerwowanym dla typów pierwotnych (int, bajt, char itp.) i literałów. Chyba że wyraźnie powiesz Javie, aby skopiowała coś, co z Objectniej pochodzi , zawsze zostanie przypisane przez odniesienie. Nawiasem mówiąc, clone()jest to płytka kopia i nie skopiuje zawartych w niej, Objectsale raczej odniesienia do nich. Jeśli chcesz zrobić głęboką kopię, zajrzyj na: stackoverflow.com/questions/64036/…
PeterT,
@PeterT - Java jest wywoływana tylko przez i przypisywana przez wartość. Zmienne typu innego niż pierwotne zawierają wartości odniesienia, które są przypisywane lub przekazywane.
Brian Roach,
Proszę, dlaczego nie mogę oldList = newList?
X09
2
@ X09 oldList = newList skopiuje odniesienie do newList do oldList, każda zmiana w newList zostanie również odzwierciedlona w oldList. Nie jest to zamierzone zachowanie.
Sreekanth Karumanaghat,
42

originalArrayList. addAll (copyArrayList);

Uwaga : w przypadku używania metody addAll () do kopiowania zawartość obu list tablic (originalArrayList i copyArrayList) odwołuje się do tych samych obiektów lub zawartości. Więc jeśli zmodyfikujesz którykolwiek z nich, drugi również będzie odzwierciedlał tę samą zmianę.

Jeśli tego nie chcesz, musisz skopiować każdy element z originalArrayList do copyArrayList, tak jak przy użyciu pętli for lub while.

Dhananjay M
źródło
1
Jak zatrzymać wpływ na inną listę, czy jest jakiś inny sposób, aby sobie z tym poradzić
Mahesh
@Mahesh - polecić ten stackoverflow.com/questions/715650/ ...
KrishPrabakar
17

Nie ma żadnych ukrytych kopii tworzonych w Javie za pośrednictwem operatora przypisania. Zmienne zawierają wartość odniesienia (wskaźnik), a kiedy używasz =, ograniczasz tylko tę wartość.

Aby zachować swoją zawartość myTempObject, musisz zrobić jej kopię.

Można to zrobić, tworząc nowy ArrayListkonstruktor za pomocą innego ArrayList:

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

Edycja: Jak Bohemian wskazuje w komentarzach poniżej, czy o to pytasz? Wykonując powyższe, oba ArrayLists ( myTempObjecti myObject) będą zawierały odniesienia do tych samych obiektów. Jeśli faktycznie potrzebujesz nowej listy zawierającej nowe kopie obiektów zawartych w myTempObject, musisz wykonać kopię każdego pojedynczego obiektu w oryginaleArrayList

Brian Roach
źródło
1
W tym przypadku będzie to działało w porządku, dzwoniąc clear()na ArrayList myTempObjectnie miałoby żadnego wpływu na obiekty zawarte Therin. Jeśli chciał nowych kopii obiektów znajdujących się na liście, to inna historia, ale nie to zinterpretowałem jako pytanie.
Brian Roach,
Wiesz, myślę, że masz rację. I błędnie interpretowane na pytanie. Martwił się, że oczyszczenie jednego oczyści drugie. Komentarz usunięty.
Bohemian
@Bohemian - Myślę, że to był uczciwy komentarz i zredagowałem swój post, aby to odzwierciedlić. Czytając jego pytanie, nie brałem pod uwagę, że to może być intencja PO.
Brian Roach
@BrianRoach Jak wykonać kopię ArrayList wewnątrz ArrayList.
Arun
8

Przeszedłem przez to, mając ten sam problem.

Powiedzenie arraylist1 = arraylist2 ustawia je tak, aby wskazywały to samo miejsce, więc jeśli zmienisz dane, zmieni się i obie listy zawsze pozostaną takie same.

Aby skopiować wartości do niezależnej listy, właśnie użyłem foreach do skopiowania zawartości:

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

wypełnij listę1 w taki sposób, w jaki obecnie jesteś.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}
PaulC
źródło
4

Załóżmy, że chcesz skopiować oldList do nowego obiektu ArrayList o nazwie newList

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

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

Te dwie listy są niezależne, zmiany jednej nie są odzwierciedlane w drugiej.

Java Main
źródło
4

Spróbujmy na przykładzie

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

W druku wyjścia jak poniżej

Jeden,
dwa,
trzy,
cztery,
pięć,
sześć

Możemy również to zrobić używając metody clone () , dla której tworzy się dokładną kopię

za tę próbę możesz spróbować

 **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());
                }**
Nilam Rajaput
źródło
3

Potrzebujesz do clone()indywidualnego obiektu. Constructora inne metody wykonują płytką kopię. Możesz wypróbować metodę Collections.copy .

adatapost
źródło
Collections.copy jest zepsuta. Po pierwsze, mylące jest twierdzenie, że kopiuje elementy, podczas gdy odwołuje się do nich tylko na nowej liście. Po drugie, musisz już mieć listę miejsc docelowych o rozmiarze nie mniejszym niż lista źródłowa ...
ACV
1

Prostym sposobem na dokładne skopiowanie oryginalnej listy jest dodanie wszystkich elementów z jednej listy do drugiej.

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

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

Teraz jeśli wprowadzisz jakiekolwiek zmiany w originalList, nie wpłynie to na duplicateList.

Chirag Khimani
źródło
0

aby skopiować jedną listę do drugiej listy, u możesz użyć metody o nazwie Collection.copy (myObject myTempObject). teraz po wykonaniu tych linii kodu u możesz zobaczyć wszystkie wartości listy w myObject.

Rakhi Jaligama
źródło
0

Kopiowanie jednej listy do drugiej jest dość proste, możesz to zrobić jak poniżej: -

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);
Imran samed
źródło
0

Oto obejście umożliwiające skopiowanie wszystkich obiektów z jednej arrayList do drugiej:

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

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

subList ma na celu zwrócenie listy z zakresem danych. więc możesz skopiować całą tablicę arrayList lub jej część.

Hassanen
źródło
0

Załóżmy, że masz dwie listy arraylisty typu String. Lubić

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

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

Teraz musimy skopiować dane drugiej tablicy do pierwszej tablicy w ten sposób,

firstArrayList = new ArrayList<>(secondArrayList );

Gotowe!!

Gyan Swaroop Awasthi
źródło