我的问题是关于幕后引用:)
所以我试图编写一个递归实现来查找给定 ArrayList (getPermsOfMe) 的所有排列。我在我要询问的两个特定行上写了“看这里”。我将 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 是 [[231][231]] 而不是 [[123][231]]。
此外,对我来说,一旦添加它,该值就不会成立,这似乎有点违反直觉。Java(以及我假设其他一些语言)这样做是有原因的吗?
这是我第一次在 stackoverflow 上提问,所以如果我应该做些什么来让我的问题更容易或者让我知道的话。