¿Cómo copio el contenido de una ArrayList en otra?

85

Tengo algunas estructuras de datos y me gustaría usar una como temporal y otra como no temporal.

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

ahora el problema con esto, por supuesto, es que en myObjectrealidad solo está apuntando myTempObject, y una vez que myTempObjectse borra, también lo es myObject.

¿Cómo conservo los valores myTempObjectal myObjectusar java?

CQM
fuente
Puede utilizar List.addAll. Pero si necesita conservar todos los objetos, borrar la lista temporal no va a borrar mucha memoria. Debido a que solo está tratando de borrar las referencias, en cuanto a los objetos, está tratando de mantenerlos.
Bhesh Gurung
Hasta donde yo sé, esta respuesta sigue siendo válida: stackoverflow.com/questions/715650/…
inicio
2
Es difícil interpretar lo que realmente está tratando de lograr. Necesitas explicar tu situación.
Bhesh Gurung

Respuestas:

138

Puedes usar ese truco:

myObject = new ArrayList<Object>(myTempObject);

o usar

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

Puede obtener información sobre el método clone () aquí

Pero debes recordar que todas estas formas te darán una copia de tu Lista , no todos sus elementos. Entonces, si cambia uno de los elementos en su Lista copiada, también se cambiará en su Lista original.

Artem
fuente
7
asignar por valor en Java es algo que está reservado para tipos primitivos (int, byte, char, etc.) y literales. A menos que le diga explícitamente a Java que copie algo que se deriva de Objectél, siempre lo asignará por referencia. Por cierto clone()es una copia superficial y no copiará el contenido Objectssino más bien referencias a ellos. Si desea hacer una copia profunda, eche un vistazo a: stackoverflow.com/questions/64036/…
PeterT
@PeterT: Java solo se llama y asigna por valor. Las variables de tipo no primitivo contienen valores de referencia que se asignan o pasan.
Brian Roach
Por favor, ¿por qué no puedo hacerlo oldList = newList?
X09
2
@ X09 oldList = newList copiará la referencia de newList a oldList, cualquier cambio en newList también se reflejará en oldList. Ese no es el comportamiento previsto.
Sreekanth Karumanaghat
42

originalArrayList. addAll (copyArrayList);

Nota : cuando se usa el método addAll () para copiar, el contenido de ambas listas de matrices (originalArrayList y copyArrayList) se refieren a los mismos objetos o contenidos. Entonces, si modifica cualquiera de ellos, el otro también reflejará el mismo cambio.

Si no quiere esto, entonces necesita copiar cada elemento de originalArrayList a copyArrayList, como usar un bucle for o while.

Dhananjay M
fuente
1
Cómo dejar de afectar a otra lista, ¿hay alguna otra forma en que podamos manejar esto?
Mahesh
@Mahesh - consulte este stackoverflow.com/questions/715650/…
KrishPrabakar
17

No hay copias implícitas realizadas en Java a través del operador de asignación. Las variables contienen un valor de referencia (puntero) y cuando las usa =, solo está manejando ese valor.

Para preservar el contenido myTempObject, necesitará hacer una copia.

Esto se puede hacer creando un nuevo ArrayListusando el constructor que toma otro ArrayList:

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

Editar: Como Bohemian señala en los comentarios a continuación, ¿es esto lo que estás preguntando? Al hacer lo anterior, tanto ArrayLists ( myTempObjecty myObject) contendrían referencias a los mismos objetos. Si realmente desea una nueva lista que contenga nuevas copias de los objetos contenidos en myTempObjectella, deberá hacer una copia de cada objeto individual en el original.ArrayList

Brian Roach
fuente
1
En este caso, funcionaría bien, ya que llamar clear()al ArrayList myTempObjectno tendría ningún efecto en los objetos que contiene. Si quería nuevas copias de los objetos contenidos en la lista, esa es otra historia, pero eso no es lo que interpreté como esta pregunta.
Brian Roach
Sabes que creo que tienes razón. I mal interpretaron la pregunta. Le preocupaba que despejar uno despejara el otro. Comentario borrado.
Bohemio
@Bohemian - Creo que fue un comentario justo y edité mi publicación para reflejarlo. No consideré que esa podría ser la intención del OP al leer su pregunta.
Brian Roach
@BrianRoach Cómo tomar una copia de una ArrayList dentro de una ArrayList.
Arun
8

Encontré esto mientras enfrentaba el mismo problema.

Decir arraylist1 = arraylist2 establece que ambos apunten al mismo lugar, por lo que si modifica alguno de los datos, los datos se alteran y, por lo tanto, ambas listas permanecen siempre iguales.

Para copiar valores en una lista independiente, solo usé foreach para copiar el contenido:

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

complete list1 de la forma que esté actualmente.

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

Suponga que desea copiar oldList en un nuevo objeto ArrayList llamado newList

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

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

Estas dos listas son independientes, los cambios en una no se reflejan en la otra.

Java Main
fuente
4

Probemos el ejemplo

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

En salida impresa como se muestra a continuación

Uno
dos
tres
cuatro
cinco
seis

También podemos hacerlo usando el método clone () para el cual se usa para crear una copia exacta

para ese intento puedes intentarlo como quieras

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

Necesitas clone()el objeto individual. Constructory otros métodos realizan copias superficiales. Puede probar el método Collections.copy .

adatapost
fuente
Collections.copy está roto. Primero, es engañoso decir que copia elementos, mientras que solo hace referencia a ellos en una nueva lista. En segundo lugar, ya debe tener una lista de destinos con un tamaño no inferior al de la lista de origen ...
ACV
1

Una forma sencilla de hacer una copia profunda de la lista original es agregar todos los elementos de una lista a otra lista.

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

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

Ahora, si realiza algún cambio en originalList, no afectará a duplicateList.

Chirag Khimani
fuente
0

para copiar una lista en la otra lista, puede usar el método llamado Collection.copy (myObject myTempObject). Ahora, después de ejecutar esta línea de código, puede ver todos los valores de la lista en myObject.

Rakhi Jaligama
fuente
0

Copiar una lista en un segundo es bastante simple, puede hacerlo de la siguiente manera:

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

Aquí hay una solución para copiar todos los objetos de una lista de matrices a otra:

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

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

subList está destinado a devolver una lista con un rango de datos. para que pueda copiar todo el arrayList o parte de él.

Hassanen
fuente
0

Suponga que tiene dos listas de matrices de tipo String. Me gusta

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

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

Ahora tenemos que copiar los datos de la segunda matriz a la primera lista de matrices como esta,

firstArrayList = new ArrayList<>(secondArrayList );

¡¡Hecho!!

Gyan Swaroop Awasthi
fuente