40

簡単に言えば、ArrayList パラメーターを持つメソッドがあります。メソッドでは、メソッドによって返されるもののみに関連する目的で ArrayList の内容を変更します。したがって、パラメーターとして渡される ArrayList がまったく影響を受けないようにします (つまり、参照として渡されません)。

私が試したことはすべて、望ましい効果を達成できませんでした。メソッド内でのみ ArrayList のコピーを使用できるが、実際の変数を変更しないようにするには、どうすればよいですか?

4

8 に答える 8

51

配列リストを参照ではなくコピーとして渡す方法があったとしても、それは浅いコピーにすぎません。

私は次のようなことをします:

void foo(final ArrayList list) {

    ArrayList listCopy = new ArrayList(list);
    // Rest of the code

}

そして、コピーしたリストで作業するだけです。

于 2013-04-03T04:07:00.150 に答える
21

ArrayList のコピー コンストラクターを使用して、ArrayList のコピーを作成できます。

ArrayList copy = new ArrayList(original);

ただし、リストの要素がオブジェクトでもある場合は、コピーのメンバーを変更すると、元のメンバーも変更されることに注意する必要があります。

于 2013-04-03T04:09:50.440 に答える
5

Collections#unmodifiableList(yourList)リストの変更不可能なコピーを送信するために渡すことができます。ちなみに、Java は常に値渡しList<Whatever>なので、値渡しです。メソッドでは、値を変更することはできませんが、その内容を変更することはできますfoo(List<Whatever> list)list

public class MyClass {

    List<Whatever> list = new ArrayList<Whatever>();

    public void bar() {
        //filling list...
        foo(Collections.unmodifiableList(list));
    }

    public void foo(List<Whatever> list) {
        //do what you want with list except modifying it...
    }
}
于 2013-04-03T04:07:10.193 に答える
3

あなたの方法でこれを試してください:

void method(List<Integer> list) {
        List copyList =  new ArrayList<Integer>();
        copyList.addAll(list); // This will create a copy of all the emlements of your original list
    }
于 2013-04-03T04:11:53.470 に答える
3

.cloneメソッドまたは aを使用しCopyOnWriteArrayListてコピーを作成すると、元のファイルに影響を与えることはありません。

于 2013-04-03T04:06:30.877 に答える
3

new ArrayList<MyObj>(old)オブジェクトが想定外の場所で参照を変更していた後でも、その理由はわかりません。そのため、内部のオブジェクトの新しいコピーをインスタンス化する必要がありました。

ArrayList のようなコピー コンストラクターを作成し、気に入りました。

 newArray = new ArrayList<MyObj>();
        for (int i = 0; i < oldArray.size(); i++) {
            newArray.add(new MyObj(ondArray.get(i)));
        }

あなたのケースでAviからの答えが十分でない場合は、他の誰かを助けることを願っています.コードが乱雑すぎて理解できない私のように= P

于 2015-01-21T12:34:41.143 に答える
1

クローンするだけです。

public ArrayList cloneArrayList(ArrayList lst){
    ArrayList list = new ArrayList();
    for (int i=0; i<lst.size(); i++){
        list.add(lst.get(i));
    }
    return list;
}

コメントに提案を追加してください。使用することもできます

ArrayList copy = new ArrayList(original);

そしてまた

ArrayList copy = new ArrayList();
copy.addAll(original);
于 2013-04-03T04:07:11.613 に答える
0

既存の回答の行ですが、ArrayList APIを使用しています。メソッドを使用できますsubList(fromIndex, toIndex)。必要な要素のみを含むリストのビューを明示的に作成します (もちろん順番に)。ここで、追加/削除などの操作でビューを変更しても、元のリストは変更されません。これにより、明示的にコピーを作成する必要がなくなります。

このようなもの:

public void recursiveMethod(List<Integer> list) {
    if(base)
         return;
    recursiveCall(list);

    // following will just create a tail list but will not actually modify the list
    recursiveCall(list.subList(1, list.size());
}
于 2016-09-07T04:36:56.863 に答える