Come copio il contenuto di un ArrayList in un altro?


85

Ho alcune strutture dati e vorrei usarne una come temporanea e un'altra come non temporanea.

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

ora il problema con questo, ovviamente, è che in myObjectrealtà sta solo indicando myTempObject, e quindi una volta myTempObjectè stato chiarito, così è myObject.

Come faccio a mantenere i valori da myTempObjectin myObjectutilizzando Java?


Puoi usare List.addAll. Ma se è necessario conservare tutti gli oggetti, cancellare l'elenco temporaneo non cancellerà davvero molta memoria. Perché stai solo cercando di cancellare i riferimenti, per quanto riguarda gli oggetti che stai cercando di mantenerli.
Bhesh Gurung

Per quanto ne so questa risposta è ancora valida: stackoverflow.com/questions/715650/…
home

2
È difficile interpretare ciò che stai veramente cercando di ottenere. Devi spiegare la tua situazione.
Bhesh Gurung

Risposte:


141

Puoi usare questo trucco:

myObject = new ArrayList<Object>(myTempObject);

o utilizzare

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

Puoi ottenere alcune informazioni sul metodo clone () qui

Ma dovresti ricordare che tutti questi modi ti daranno una copia della tua Lista , non tutti i suoi elementi. Quindi, se modifichi uno degli elementi nella tua lista copiata, verrà modificato anche nella tua lista originale.


7
Assegnare per valore in Java è qualcosa che è riservato per i tipi primitivi (int, byte, char, ecc.) e letterali. A meno che tu non dica esplicitamente a Java di copiare qualcosa che è derivato da Objectesso, verrà sempre assegnato per riferimento. Tra l'altro clone()è una copia superficiale e non copierà il contenuto Objectsma piuttosto i riferimenti ad essi. Se si vuole fare una profonda copia dare un'occhiata a: stackoverflow.com/questions/64036/...
PeterT

@PeterT - Java è solo chiamare da e assegnare per valore. Le variabili di tipo non primitivo contengono valori di riferimento che vengono assegnati o passati.
Brian Roach

Per favore, perché non posso farlo oldList = newList?
X09

2
@ X09 oldList = newList copierà il riferimento da newList a oldList, qualsiasi modifica in newList si rifletterà anche nella oldList. Questo non è il comportamento previsto.
Sreekanth Karumanaghat

42

originalArrayList. addAll (copyArrayList);

Nota : quando si utilizza il metodo addAll () per la copia, il contenuto di entrambi gli elenchi di array (originalArrayList e copyArrayList) fa riferimento agli stessi oggetti o contenuti. Quindi, se modifichi uno qualsiasi di essi, anche l'altro rifletterà lo stesso cambiamento.

Se non vuoi questo, devi copiare ogni elemento da originalArrayList a copyArrayList, come usare un ciclo for o while.


1
Come fermare gli effetti su un'altra lista c'è un altro modo in cui possiamo gestirlo
Mahesh

@Mahesh - fare riferimento questo stackoverflow.com/questions/715650/...
KrishPrabakar

17

Non ci sono copie implicite fatte in java tramite l'operatore di assegnazione. Le variabili contengono un valore di riferimento (puntatore) e quando lo usi =copi solo quel valore.

Al fine di preservare il contenuto di myTempObject te dovresti farne una copia.

Questo può essere fatto creando un nuovo ArrayListusando il costruttore che ne prende un altro ArrayList:

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

Modifica: come sottolinea Bohemian nei commenti qui sotto, è questo che stai chiedendo? Facendo quanto sopra, sia ArrayLists ( myTempObjectche myObject) conterrebbero riferimenti agli stessi oggetti. Se in realtà vuoi un nuovo elenco che contenga nuove copie degli oggetti contenuti myTempObjectallora dovresti fare una copia di ogni singolo oggetto nell'originaleArrayList


1
In questo caso si avrebbe funzionato bene come chiamare clear()sulla ArrayList myTempObjectnon avrebbe alcun effetto sugli oggetti contenuti Therin. Se voleva nuove copie degli oggetti contenuti nella lista, questa è un'altra storia, ma non è quello che ho interpretato come una domanda.
Brian Roach

Sai che penso tu abbia ragione. Ho interpretato male la domanda. Era preoccupato che cancellarne uno avrebbe cancellato l'altro. Commento eliminato.
Bohemian

@ Bohemian - Penso che sia stato un commento equo e ho modificato il mio post per rispecchiarlo. Non ho considerato che potrebbe essere l'intento dell'OP quando ho letto la sua domanda.
Brian Roach

@BrianRoach Come prendere una copia di un ArrayList all'interno di un ArrayList.
Arun

8

Mi sono imbattuto in questo mentre affrontavo lo stesso problema.

Dire arraylist1 = arraylist2 li imposta entrambi in modo che puntino nello stesso punto, quindi se si alterano i dati vengono modificati e quindi entrambi gli elenchi rimangono sempre gli stessi.

Per copiare i valori in un elenco indipendente ho appena usato foreach per copiare il contenuto:

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

riempire list1 in qualunque modo tu sia attualmente.

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

4

Supponi di voler copiare oldList in un nuovo oggetto ArrayList chiamato newList

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

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

Questi due elenchi sono indipendenti, le modifiche a uno non si riflettono sull'altro.


4

Proviamo l'esempio

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

Nell'output di stampa come di seguito

Uno
due
tre
quattro
cinque
sei

Possiamo anche farlo usando il metodo clone () per il quale viene utilizzato per creare una copia esatta

per quella prova puoi provare come piace

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

Hai bisogno clone()del singolo oggetto. Constructore altri metodi eseguono una copia superficiale. Puoi provare il metodo Collections.copy .


Collections.copy è rotta. Innanzitutto, è fuorviante affermare che copia gli elementi, mentre li fa riferimento solo in un nuovo elenco. Secondo, è necessario disporre già di un elenco di destinazione con una dimensione non inferiore all'elenco di origine ...
ACV

1

Un modo semplice per fare una copia completa dell'elenco originale è aggiungere tutti gli elementi da un elenco a un altro elenco.

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

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

Ora, se apporti modifiche a originalList, non influirà su duplicateList.


0

per copiare una lista nell'altra lista, puoi usare il metodo chiamato Collection.copy (myObject myTempObject). Ora dopo aver eseguito queste righe di codice puoi vedere tutti i valori della lista in myObject.


0

Copiare un elenco in un secondo è abbastanza semplice, puoi farlo come di seguito: -

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

0

Ecco una soluzione alternativa per copiare tutti gli oggetti da un arrayList a un altro:

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

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

subList ha lo scopo di restituire un elenco con un intervallo di dati. quindi puoi copiare l'intero arrayList o parte di esso.


0

Supponiamo di avere due elenchi di array di tipo String. Piace

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

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

Ora dobbiamo copiare i dati del secondo array nel primo array in questo modo,

firstArrayList = new ArrayList<>(secondArrayList );

Fatto!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.