簡単に言えば、ArrayList パラメーターを持つメソッドがあります。メソッドでは、メソッドによって返されるもののみに関連する目的で ArrayList の内容を変更します。したがって、パラメーターとして渡される ArrayList がまったく影響を受けないようにします (つまり、参照として渡されません)。
私が試したことはすべて、望ましい効果を達成できませんでした。メソッド内でのみ ArrayList のコピーを使用できるが、実際の変数を変更しないようにするには、どうすればよいですか?
簡単に言えば、ArrayList パラメーターを持つメソッドがあります。メソッドでは、メソッドによって返されるもののみに関連する目的で ArrayList の内容を変更します。したがって、パラメーターとして渡される ArrayList がまったく影響を受けないようにします (つまり、参照として渡されません)。
私が試したことはすべて、望ましい効果を達成できませんでした。メソッド内でのみ ArrayList のコピーを使用できるが、実際の変数を変更しないようにするには、どうすればよいですか?
配列リストを参照ではなくコピーとして渡す方法があったとしても、それは浅いコピーにすぎません。
私は次のようなことをします:
void foo(final ArrayList list) {
ArrayList listCopy = new ArrayList(list);
// Rest of the code
}
そして、コピーしたリストで作業するだけです。
ArrayList のコピー コンストラクターを使用して、ArrayList のコピーを作成できます。
ArrayList copy = new ArrayList(original);
ただし、リストの要素がオブジェクトでもある場合は、コピーのメンバーを変更すると、元のメンバーも変更されることに注意する必要があります。
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...
}
}
あなたの方法でこれを試してください:
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
}
.clone
メソッドまたは aを使用しCopyOnWriteArrayList
てコピーを作成すると、元のファイルに影響を与えることはありません。
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
クローンするだけです。
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);
既存の回答の行ですが、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());
}