web-dev-qa-db-ja.com

あるArrayListの内容を別のArrayListにコピーするにはどうすればよいですか?

いくつかのデータ構造があり、一方を一時的なものとして使用し、もう一方を一時的でないものとして使用したいと思います。

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

もちろん、これに関する問題は、myObjectが実際にmyTempObjectを指しているだけであり、したがってmyTempObjectがクリアされると、myObjectもクリアされるということです。

Javaを使用してmyTempObjectmyObjectの値を保持するにはどうすればよいですか?

74
CQM

このようなトリックを使用できます:

myObject = new ArrayList<Object>(myTempObject);

または使用する

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

Clone()メソッドに関する情報を取得できます here

ただし、これらすべての方法で、すべての要素ではなく、Listのコピーが得られることに注意してください。したがって、コピーしたリストの要素の1つを変更すると、元のリストの要素も変更されます。

121
Artem

originalArrayList .addAll(copyArrayList);

注意してください:addAll()メソッドを使用してコピーする場合、両方の配列リスト(originalArrayListおよびcopyArrayList)のコンテンツは、同じオブジェクトまたはコンテンツを参照します。そのため、いずれかを変更すると、もう一方にも同じ変更が反映されます。

これを望まない場合は、forまたはwhileループを使用するなど、originalArrayListからcopyArrayListに各要素をコピーする必要があります。

38
Dhananjay M

割り当て演算子を介してJavaに暗黙のコピーが作成されることはありません。変数には参照値(ポインター)が含まれており、=を使用するときは、その値のみをコピーしています。

myTempObjectの内容を保持するには、そのコピーを作成する必要があります。

これは、別のArrayListをとるコンストラクターを使用して、新しいArrayListを作成することで実行できます。

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

編集:ボヘミアンは以下のコメントで指摘しているように、これはあなたが求めていることですか?上記を実行すると、ArrayLists(myTempObjectおよびmyObject)の両方にsameオブジェクトへの参照が含まれます。 myTempObjectに含まれるオブジェクトの新しいコピーを含む新しいリストが実際に必要な場合は、元のArrayListにある個々のオブジェクトのコピーを作成する必要があります。

16
Brian Roach

同じ問題に自分自身で直面しながら、これに出くわしました。

Arraylist1 = arraylist2と指定すると、両方が同じ場所を指すように設定されるため、データを変更すると、両方のリストが常に同じままになります。

値を独立したリストにコピーするには、foreachを使用して内容をコピーしました。

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

list1を現在の方法で埋めます。

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

OldListをnewListと呼ばれる新しいArrayListオブジェクトにコピーしたい場合

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

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

これら2つのリストは独立しており、一方への変更はもう一方には反映されません。

4
Java Main

例を試してみましょう

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

印刷中出力以下のように

1




6

clone()メソッドを使用して正確なコピーを作成することもできます

そのためにあなたが好きなように試すことができます

 **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());
                }**
4
Nilam Rajaput

個々のオブジェクトをclone()する必要があります。 Constructorおよびその他のメソッドはシャローコピーを実行します。 Collections.copy メソッドを試すことができます。

3
adatapost

元のリストのディープコピーを作成する簡単な方法は、あるリストから別のリストにすべての要素を追加することです。

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

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

これで、originalListに変更を加えても、duplicateListには影響しません。

1
Chirag Khimani

1つのarrayListから別のarrayListにすべてのオブジェクトをコピーする回避策は次のとおりです。

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

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

subListは、データの範囲を含むリストを返すことを目的としています。そのため、arrayList全体またはその一部をコピーできます。

0
Hassanen

1つのリストを他のリストにコピーするには、Collection.copy(myObject myTempObject)というメソッドを使用します。これらのコード行を実行すると、uはmyObject内のすべてのリスト値を確認できます。

0
Rakhi Jaligama

1つのリストを2番目にコピーするのは非常に簡単です。以下のようにできます。

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