Comment copier le contenu d'une ArrayList dans une autre?


85

J'ai des structures de données et j'aimerais en utiliser une comme temporaire et une autre comme non temporaire.

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

maintenant, le problème avec cela, bien sûr, c'est que cela myObjectne fait que pointer vers myTempObject, et donc une fois myTempObjectest effacé, il en est de même myObject.

Comment puis-je conserver les valeurs de myTempObjecten myObjectutilisant java?


Vous pouvez utiliser List.addAll. Mais si vous avez besoin de conserver tous les objets, effacer la liste temporaire n'effacera pas vraiment beaucoup de mémoire. Parce que vous essayez seulement d'effacer les références, dans la mesure où vous essayez de les conserver.
Bhesh Gurung

Pour autant que je sache, cette réponse est toujours valable: stackoverflow.com/questions/715650/…
accueil

2
Il est difficile d'interpréter ce que vous essayez vraiment d'accomplir. Vous devez expliquer votre situation.
Bhesh Gurung

Réponses:


138

Vous pouvez utiliser une telle astuce:

myObject = new ArrayList<Object>(myTempObject);

Ou utiliser

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

Vous pouvez obtenir des informations sur la méthode clone () ici

Mais vous devez vous rappeler que tous ces moyens vous donneront une copie de votre liste , pas tous ses éléments. Donc, si vous modifiez l'un des éléments de votre liste copiée, il sera également modifié dans votre liste d'origine.


7
assign by value en Java est quelque chose qui est réservé aux types primitifs (int, byte, char, etc.) et aux littéraux. À moins que vous ne disiez explicitement à Java de copier quelque chose qui en est dérivé, l' Objectaffectera toujours par référence. En passant, clone()c'est une copie superficielle et ne copiera pas le contenu Objectsmais plutôt des références à eux. Si vous voulez faire une copie profonde, jetez un œil à: stackoverflow.com/questions/64036/…
PeterT

@PeterT - Java est uniquement appelé par et assigné par valeur. Les variables de type non primitif contiennent des valeurs de référence qui sont affectées ou transmises.
Brian Roach

S'il vous plaît, pourquoi je ne peux pas faire oldList = newList?
X09

2
@ X09 oldList = newList copiera la référence de newList dans oldList, tout changement dans newList sera également reflété dans oldList. Ce n'est pas le comportement prévu.
Sreekanth Karumanaghat

42

originalArrayList. addAll (copyArrayList);

Remarque : lorsque vous utilisez la méthode addAll () pour copier, le contenu des deux listes de tableaux (originalArrayList et copyArrayList) fait référence aux mêmes objets ou contenus. Donc, si vous modifiez l'un d'entre eux, l'autre reflétera également le même changement.

Si vous ne le souhaitez pas, vous devez copier chaque élément de l'originalArrayList vers le copyArrayList, comme en utilisant une boucle for ou while.


1
Comment arrêter l'affect sur une autre liste existe-t-il un autre moyen de gérer cela
Mahesh


17

Il n'y a pas de copies implicites effectuées en java via l'opérateur d'affectation. Les variables contiennent une valeur de référence (pointeur) et lorsque vous utilisez, =vous ne copiez que cette valeur.

Afin de préserver le contenu, myTempObjectvous devez en faire une copie.

Cela peut être fait en créant un nouveau en ArrayListutilisant le constructeur qui en prend un autre ArrayList:

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

Edit: Comme le souligne Bohemian dans les commentaires ci-dessous, est-ce ce que vous demandez? En faisant ce qui précède, ArrayLists ( myTempObjectet myObject) contiendraient des références aux mêmes objets. Si vous voulez réellement une nouvelle liste contenant de nouvelles copies des objets contenus dans, myTempObjectvous devrez alors faire une copie de chaque objet individuel dans l'originalArrayList


1
Dans ce cas, cela fonctionnerait très bien, car appeler clear()le ArrayList myTempObjectn'aurait aucun effet sur les objets qu'il contient. S'il voulait de nouvelles copies des objets contenus dans la liste, c'est une autre histoire, mais ce n'est pas ce que j'ai interprété cette question comme une question.
Brian Roach

Tu sais, je pense que tu as raison. J'ai mal interprété la question. Il craignait que le nettoyage de l'un efface l'autre. Commentaire supprimé.
Bohème

@Bohemian - Je pense que c'était un commentaire juste et j'ai édité mon message pour le refléter. Je n'ai pas pensé que c'était l'intention du PO en lisant sa question.
Brian Roach

@BrianRoach Comment prendre une copie d'une ArrayList dans une ArrayList.
Arun

8

Je suis tombé sur cela en faisant face moi-même au même problème.

Dire arraylist1 = arraylist2 les place tous les deux au même endroit, donc si vous modifiez l'une ou l'autre des modifications de données et ainsi les deux listes restent toujours les mêmes.

Pour copier des valeurs dans une liste indépendante, je viens d'utiliser foreach pour copier le contenu:

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

remplissez list1 de la manière dont vous êtes actuellement.

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

4

Supposons que vous souhaitiez copier oldList dans un nouvel objet ArrayList appelé newList

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

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

Ces deux listes sont indépendantes, les modifications apportées à l'une ne sont pas répercutées sur l'autre.


4

Essayons l'exemple

     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 sortie d' impression comme ci-dessous

Un
deux
trois
quatre
cinq
six

Nous pouvons également le faire en utilisant la méthode clone () pour laquelle est utilisée pour créer une copie exacte

pour cet essai, vous pouvez essayer comme

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

Vous avez besoin de clone()l'objet individuel. Constructoret d'autres méthodes effectuent une copie superficielle. Vous pouvez essayer la méthode Collections.copy .


Collections.copy est cassé. Premièrement, il est trompeur en disant qu'il copie des éléments, alors qu'il ne les fait référence que dans une nouvelle liste. Deuxièmement, vous devez déjà avoir une liste de destinations dont la taille n'est pas inférieure à la liste source ...
ACV

1

Un moyen simple de faire une copie complète de la liste originale est d'ajouter tous les éléments d'une liste à une autre liste.

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

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

Maintenant, si vous apportez des modifications à originalList, cela n'aura aucun impact sur duplicateList.


0

pour copier une liste dans l'autre liste, vous pouvez utiliser la méthode appelée Collection.copy (myObject myTempObject). Maintenant, après avoir exécuté ces lignes de code, vous pouvez voir toutes les valeurs de la liste dans myObject.


0

La copie d'une liste dans la seconde est assez simple, vous pouvez le faire comme ci-dessous: -

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

0

Voici une solution de contournement pour copier tous les objets d'un arrayList à un autre:

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

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

subList est destiné à renvoyer une liste avec une plage de données. afin que vous puissiez copier l'intégralité de la arrayList ou une partie de celle-ci.


0

Supposons que vous ayez deux arraylist de type String. Comme

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

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

Maintenant, nous devons copier les données du deuxième tableau dans le premier arraylist comme ceci,

firstArrayList = new ArrayList<>(secondArrayList );

Terminé!!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.