Bir ArrayList'in içeriğini diğerine nasıl kopyalarım?


85

Bazı veri yapılarım var ve birini geçici, diğerini geçici değil olarak kullanmak istiyorum.

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

şimdi bununla ilgili sorun elbette bunun myObjectsadece işaret etmesi myTempObjectve bu yüzden bir kez myTempObjecttemizlendiğinde öyle myObject.

Nasıl değerleri korumak do myTempObjectin myObjectjava kullanarak?


Kullanabilirsiniz List.addAll. Ancak tüm nesneleri saklamanız gerekiyorsa, geçici listeyi temizlemek gerçekten çok fazla belleği temizlemeyecektir. Çünkü siz, saklamaya çalıştığınız nesnelere kadar sadece referansları temizlemeye çalışıyorsunuz.
Bhesh Gurung

Bildiğim kadarıyla bu cevap hala geçerli: stackoverflow.com/questions/715650/…
ev

2
Gerçekten neyi başarmaya çalıştığınızı yorumlamak zor. Durumunuzu açıklamalısınız.
Bhesh Gurung

Yanıtlar:


141

Böyle bir numara kullanabilirsiniz:

myObject = new ArrayList<Object>(myTempObject);

ya da kullan

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

Buradan clone () yöntemi hakkında biraz bilgi edinebilirsiniz.

Ancak, tüm bu yolların size Listenizin tüm öğelerinin değil, bir kopyasını vereceğini unutmamalısınız . Dolayısıyla, kopyalanan Listenizdeki öğelerden birini değiştirirseniz, orijinal Listenizde de değiştirilecektir.


7
Java'da değere göre atama, ilkel türler (int, bayt, karakter, vb.) ve değişmezler için ayrılmış bir şeydir. Java'ya bundan türetilen bir şeyi kopyalamasını açıkça söylemediğiniz sürece, Objecther zaman referans olarak atayacaktır. Bu arada clone(), sığ bir kopya ve içerilenleri Objectsdeğil, bunlara yapılan atıfları kopyalayacaktır . Derin bir kopya yapmak istiyorsanız, bir göz atın: stackoverflow.com/questions/64036/…
PeterT

@PeterT - Java yalnızca değere göre çağrılır ve atanır. İlkel olmayan tür değişkenler , atanan veya iletilen referans değerleri içerir .
Brian Roach

Lütfen neden yapamıyorum oldList = newList?
X09

2
@ X09 oldList = newList, newList'in referansını oldList'e kopyalayacak, newList'teki herhangi bir değişiklik de oldList'e yansıtılacaktır. Amaçlanan davranış bu değil.
Sreekanth Karumanaghat

42

originalArrayList. addAll (copyArrayList);

Lütfen Dikkat : Kopyalamak için addAll () yöntemini kullanırken, her iki dizi listesinin (originalArrayList ve copyArrayList) içeriği aynı nesnelere veya içeriğe işaret eder. Dolayısıyla, herhangi birini değiştirirseniz diğeri de aynı değişikliği yansıtacaktır.

Bunu istemiyorsanız, for veya while döngüsü kullanmak gibi her bir öğeyi originalArrayList'ten copyArrayList'e kopyalamanız gerekir.


1
Başka bir listeyi etkilemeyi nasıl durdurabiliriz, bunun üstesinden gelebilmemiz için başka bir yol var mı
Mahesh


17

Atama operatörü aracılığıyla java'da yapılan hiçbir örtük kopya yoktur. Değişkenler bir referans değeri (işaretçi) içerir ve kullandığınızda =yalnızca o değeri başarsınız.

İçeriğinizi korumak myTempObjectiçin bir kopyasını almanız gerekir.

Bu, kurucuyu ArrayListkullanarak başka bir tane alan yeni bir tane oluşturarak yapılabilir ArrayList:

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

Düzenleme: Bohemian'ın aşağıdaki yorumlarda işaret ettiği gibi, sorduğunuz şey bu mu? Yukarıdakileri yaparak, her iki ArrayLists ( myTempObjectve myObject) de aynı nesnelere referanslar içerecektir . Gerçekten içerdiği nesnelerin yeni kopyalarını içeren yeni bir liste istiyorsanız myTempObject, orijinaldeki her bir nesnenin bir kopyasını oluşturmanız gerekir.ArrayList


1
Bu durumda çağırarak olarak cezayı çalışacak clear()üzerindeki ArrayList myTempObjectnesneler therin içerdiği üzerinde hiçbir etkisi olurdu. Listede yer alan nesnelerin yeni kopyalarını istiyorsa, bu başka bir hikaye, ama bu soruyu sormak olarak yorumladığım şey bu değil.
Brian Roach

Biliyorsun haklı olduğunu düşünüyorum. Ben soruyu yanlış yorumlanır. Birini temizlemenin diğerini temize çıkaracağından endişeliydi. Yorum silindi.
Bohemian

@Bohemian - Adil bir yorum olduğunu düşünüyorum ve bunu yansıtmak için gönderimi düzenledim. Sorusunu okurken OP'nin niyetinin bu olabileceğini düşünmedim.
Brian Roach

@BrianRoach Bir ArrayList içinde bir ArrayList kopyası nasıl alınır.
Arun

8

Ben de aynı sorunla yüzleşirken bununla karşılaştım.

Arraylist1 = arraylist2 demek, ikisinin de aynı yere işaret etmesini sağlar, böylece eğer veriyi değiştirirseniz ve böylece her iki liste de her zaman aynı kalır.

Değerleri bağımsız bir listeye kopyalamak için içeriği kopyalamak için foreach kullandım:

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

şu anda olduğun şekilde list1'i doldur.

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

4

OldList'i newList adlı yeni bir ArrayList nesnesine kopyalamak istediğinizi varsayalım.

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

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

Bu iki liste birbirinden bağımsızdır, birinde yapılan değişiklikler diğerine yansıtılmaz.


4

Örneği deneyelim

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

Baskı olarak çıktı aşağıdaki gibi

Bir
İki
Üç
Dört
Beş
Altı

Tam kopya oluşturmak için kullanılan clone () yöntemini kullanarak da yapabiliriz

bunun için deneyebilirsin

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

clone()Bireysel nesneye ihtiyacınız var . Constructorve diğer yöntemler yüzeysel kopyalama gerçekleştirir. Collections.copy yöntemini deneyebilirsiniz .


Collections.copy kırılmış, bozulmuş. Birincisi, öğeleri kopyaladığını söyleyerek yanıltıcıdır, oysa bunlara yalnızca yeni bir listede atıfta bulunur. İkinci olarak, kaynak listesinden daha küçük olmayan bir hedef listeniz olması gerekir ...
ACV

1

Orijinal listenin derin kopyasını almanın basit yolu, tüm öğeleri bir listeden başka bir listeye eklemektir.

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

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

Şimdi originalList'te herhangi bir değişiklik yaparsanız, duplicateList'i etkilemeyecektir.


0

bir listeyi diğer listeye kopyalamak için, Collection.copy (myObject myTempObject) adlı yöntemi kullanabilirsiniz. şimdi bu kod satırını çalıştırdıktan sonra myObject'deki tüm liste değerlerini görebilirsiniz.


0

Bir listenin saniyeye kopyalanması oldukça basittir, bunu aşağıdaki gibi yapabilirsiniz: -

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

0

İşte tüm nesneleri bir arrayList'ten diğerine kopyalamak için bir geçici çözüm:

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

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

subList, bir dizi veriye sahip bir Liste döndürmek için tasarlanmıştır. böylece diziListesinin tamamını veya bir kısmını kopyalayabilirsiniz.


0

Dize türünde iki dizi listeniz olduğunu varsayalım. Sevmek

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

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

Şimdi ikinci dizinin verilerini bu şekilde birinci dizi listesine kopyalamalıyız,

firstArrayList = new ArrayList<>(secondArrayList );

Bitti !!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.