Wie kopiere ich den Inhalt einer ArrayList in eine andere?

85

Ich habe einige Datenstrukturen und möchte eine als temporäre und eine andere als nicht temporäre verwenden.

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

Jetzt ist das Problem dabei natürlich, dass myObjectes wirklich nur darauf hinweist myTempObject, und so ist es einmal myTempObjectgeklärt, so ist es auch myObject.

Wie behalte ich die Werte myTempObjectbei der myObjectVerwendung von Java bei?

CQM
quelle
Sie können verwenden List.addAll. Wenn Sie jedoch alle Objekte behalten müssen, wird durch das Löschen der temporären Liste nicht wirklich viel Speicherplatz gelöscht. Weil Sie nur versuchen, die Referenzen zu löschen, soweit Sie Objekte behalten möchten.
Bhesh Gurung
Soweit ich weiß, ist diese Antwort immer noch gültig: stackoverflow.com/questions/715650/…
home
2
Es ist schwer zu interpretieren, was Sie wirklich erreichen wollen. Sie müssen Ihre Situation erklären.
Bhesh Gurung

Antworten:

136

Sie können einen solchen Trick anwenden:

myObject = new ArrayList<Object>(myTempObject);

oder verwenden

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

Informationen zur clone () -Methode finden Sie hier

Sie sollten sich jedoch daran erinnern, dass Sie auf all diese Arten eine Kopie Ihrer Liste erhalten , nicht alle ihrer Elemente. Wenn Sie also eines der Elemente in Ihrer kopierten Liste ändern, wird es auch in Ihrer ursprünglichen Liste geändert.

Artem
quelle
7
Das Zuweisen nach Wert in Java ist etwas, das primitiven Typen (int, byte, char usw.) und Literalen vorbehalten ist. Sofern Sie Java nicht ausdrücklich anweisen, etwas zu kopieren, das davon abgeleitet ist, wird Objectes immer als Referenz zugewiesen. Übrigens clone()ist eine flache Kopie und wird nicht die enthaltenen kopieren Objects, sondern Verweise auf sie. Wenn Sie eine Deep-Copy erstellen
möchten,
@PeterT - Java wird nur nach Wert aufgerufen und nach Wert zugewiesen. Nicht primitive Typvariablen enthalten Referenzwerte, die zugewiesen oder übergeben werden.
Brian Roach
Bitte warum kann ich nicht tun oldList = newList?
X09
1
@ X09 oldList = newList kopiert den Verweis der newList auf oldList. Jede Änderung in newList wird auch in der oldList berücksichtigt. Das ist nicht das beabsichtigte Verhalten.
Sreekanth Karumanaghat
42

originalArrayList. addAll (copyArrayList);

Hinweis : Wenn Sie zum Kopieren die Methode addAll () verwenden, verweist der Inhalt der beiden Array-Listen (originalArrayList und copyArrayList) auf dieselben Objekte oder Inhalte. Wenn Sie also eine davon ändern, spiegelt auch die andere die gleiche Änderung wider.

Wenn Sie dies nicht möchten, müssen Sie jedes Element aus der ursprünglichenArrayList in die copyArrayList kopieren, z. B. mithilfe einer for- oder while-Schleife.

Dhananjay M.
quelle
1
Wie man den Einfluss auf eine andere Liste stoppt, gibt es eine andere Möglichkeit, wie wir damit umgehen können
Mahesh
@ Mahesh - beziehen Sie sich auf diese stackoverflow.com/questions/715650/…
KrishPrabakar
17

In Java werden keine impliziten Kopien über den Zuweisungsoperator erstellt. Variablen enthalten einen Referenzwert (Zeiger), und wenn Sie ihn verwenden =, kopieren Sie nur diesen Wert.

Um den Inhalt von myTempObjectIhnen zu erhalten , müssten Sie eine Kopie davon erstellen.

Dies kann erreicht werden, indem ArrayListmit dem Konstruktor, der einen anderen verwendet , ein neuer erstellt wird ArrayList:

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

Bearbeiten: Wie Bohemian in den Kommentaren unten betont, ist dies das, was Sie fragen? Auf diese Weise würden sowohl ArrayLists ( myTempObjectals auch myObject) Verweise auf dieselben Objekte enthalten. Wenn Sie tatsächlich eine neue Liste wünschen, die neue Kopien der darin enthaltenen Objekte enthält, müssen myTempObjectSie eine Kopie jedes einzelnen Objekts im Original erstellenArrayList

Brian Roach
quelle
1
In diesem Fall würde es gut funktionieren, da das Aufrufen clear()von ArrayList myTempObjectkeine Auswirkungen auf die darin enthaltenen Objekte haben würde. Wenn er neue Kopien der in der Liste enthaltenen Objekte haben wollte, ist das eine andere Geschichte, aber ich habe diese Frage nicht so interpretiert.
Brian Roach
Du weißt, ich denke du hast recht. Ich habe die Frage falsch interpretiert. Er war besorgt, dass das Löschen des einen das andere löschen würde. Kommentar gelöscht.
Böhmisch
@Bohemian - Ich denke, es war ein fairer Kommentar und ich habe meinen Beitrag bearbeitet, um ihn wiederzugeben. Ich habe nicht gedacht, dass dies die Absicht des OP sein könnte, als er seine Frage las.
Brian Roach
@BrianRoach So erstellen Sie eine Kopie einer ArrayList in einer ArrayList.
Arun
8

Kam darüber hinweg, während ich mich dem gleichen Problem stellte.

Wenn Sie arraylist1 = arraylist2 sagen, werden beide so eingestellt, dass sie auf dieselbe Stelle zeigen. Wenn Sie also eine der Datenänderungen ändern, bleiben beide Listen immer gleich.

Um Werte in eine unabhängige Liste zu kopieren, habe ich nur foreach verwendet, um den Inhalt zu kopieren:

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

Füllen Sie list1 so aus, wie Sie gerade sind.

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

Angenommen, Sie möchten oldList in ein neues ArrayList-Objekt namens newList kopieren

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

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

Diese beiden Listen sind unabhängig voneinander. Änderungen an einer Liste werden nicht an die andere weitergegeben.

Java Main
quelle
4

Versuchen wir das Beispiel

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

In Druckausgabe wie unten

Eins
zwei
drei
vier
fünf
sechs

Wir können dies auch mit der Methode clone () tun, mit der eine exakte Kopie erstellt wird

Für diesen Versuch können Sie versuchen, wie

 **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
quelle
3

Sie müssen auf clone()das einzelne Objekt. Constructorund andere Methoden führen eine flache Kopie durch. Sie können die Methode Collections.copy ausprobieren .

Adatapost
quelle
Collections.copy ist kaputt. Erstens ist es irreführend zu sagen, dass Elemente kopiert werden, während sie nur in einer neuen Liste referenziert werden. Zweitens müssen Sie bereits eine Zielliste haben, deren Größe nicht niedriger als die Quellliste ist ...
ACV
1

Eine einfache Möglichkeit, eine tiefe Kopie der Originalliste zu erstellen, besteht darin, alle Elemente von einer Liste zu einer anderen Liste hinzuzufügen.

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

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

Wenn Sie jetzt Änderungen an originalList vornehmen, hat dies keine Auswirkungen auf duplicateList.

Chirag Khimani
quelle
0

Um eine Liste in die andere Liste zu kopieren, können Sie die Methode Collection.copy (myObject myTempObject) verwenden. Jetzt können Sie nach Ausführung dieser Codezeile alle Listenwerte im myObject anzeigen.

Rakhi Jaligama
quelle
0

Das Kopieren einer Liste in eine zweite ist ganz einfach. Sie können dies wie folgt tun: -

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

Hier ist eine Problemumgehung, um alle Objekte von einer ArrayList in eine andere zu kopieren:

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

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

subList soll eine Liste mit einem Datenbereich zurückgeben. So können Sie die gesamte ArrayList oder einen Teil davon kopieren.

Hassanen
quelle
0

Angenommen, Sie haben zwei Arraylisten vom Typ String. Mögen

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

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

Jetzt müssen wir die Daten des zweiten Arrays wie folgt in die erste Arrayliste kopieren.

firstArrayList = new ArrayList<>(secondArrayList );

Getan!!

Gyan Swaroop Awasthi
quelle