私の質問は、参照する舞台裏についてです:)
そのため、特定のArrayList(getPermsOfMe)のすべての順列を見つけるための再帰的な実装を作成しようとしていました。私が質問している2つの特定の行にLOOKHEREを書きました。thisPermをallPermutationsに追加し、コードの後半でthisPermを変更しました。これにより、allPermutationsで以前に追加された値が新しい値に変更されました。
public ArrayList<ArrayList<Integer>> allPermsHelper(ArrayList<Integer> getPermsOfMe, ArrayList<ArrayList<Integer>> allPermutations, ArrayList<Integer> thisPerm){
if (getPermsOfMe.isEmpty()){
System.out.println("thisPerm = " + thisPerm);
allPermutations.add(thisPerm); //LOOK HERE
System.out.println("allPermutations = " +allPermutations);
}
else {
for (int i = 0; i<ofMe.size(); i++){
//swapping the two specified elements in getPermsOfMe
x = getPermsOfMe.get(i);
getPermsOfMe.set(i, getPermsOfMe.get(getPermsOfMe.size()-1));
getPermsOfMe.set(getPermsOfMe.size()-1, x);
if (thisPerm.isEmpty()){
thisPerm.add(getPermsOfMe.remove(getPermsOfMe.size()-1));
}
else{
thisPerm.add(0,getPermsOfMe.remove(getPermsOfMe.size()-1));
}
allPermsHelper(getPermsOfMe, allPermutations, thisPerm);
getPermsOfMe.add(0,thisPerm.remove(0)); // LOOK HERE
}
}
return allPermutations;
}
//an example output (if getPermsOfMe was [123]):
thisPerm = [123]
allPermutations = [[123]]
thisPerm = [231]
allPermutations = [[231],[231]]
thisPerm = [321]
allPermutations = [[321],[321],[321]]
...
myQuestionは、(オブジェクトと参照に関して)正確に前の値が追加された後も変更されない理由です。そこで最初に[123]を追加しました。次に[231]を追加しましたが、allPermuationsは[[123][231]]ではなく[[231][231]]でした。
また、一度追加すると値が保持されないのは少し直感に反しているようです。Java(および他のいくつかの言語を想定しているim)がこのようにした理由はありますか?
スタックオーバーフローについて質問するのはこれが初めてなので、質問を簡単にするために何かする必要がある場合、または私に知らせてください。