舊的價值/參考事物。對於Bron-Kerbosch的這種改編,我得到ConcurrentModificationException 。Java遞歸,用對象調用它 - 如何複製對象?
public int[] bk(ArrayList<Integer> R, ArrayList<Integer> P, ArrayList<Integer> X) {
int count[] = new int[n];
int u=0, c = 0;
ArrayList<Integer> tempPX = new ArrayList<Integer>();
ArrayList<Integer> newP = P;
ArrayList<Integer> newX = X;
ArrayList<Integer> newR = R;
if (P.isEmpty() && X.isEmpty()) {
count[R.size()]++;
} else {
u = 0; c = 0; // find vertex with largest degree
tempPX.addAll(P); tempPX.addAll(X); // P ⋃ X
for (Integer v : tempPX) {
if (neighbours[v].size() > neighbours[u].size()) {
u = c;
}
c++;
}
P.removeAll(neighbours[u]); // P \ neighbours[u]
for (Integer v : newP) {
newR.add(v); // R ⋃ v
newP.retainAll(neighbours[v]); // P â‹‚ neighbours[v]
newX.retainAll(neighbours[v]); // X â‹‚ neighbours[v]
bk(newR, newP, newX);
P.remove(v); // removing object
X.add(v); // X ⋃ v
}
}
return count;
}
在(整數v:newP)的行處發生異常,並在那裏發生遞歸調用。 我需要P.removeAll(neighbours [u]);然後在結果列表中循環,在註釋中做內容,並在遞歸調用中使用PASS COPIES,這樣它就不會投訴,並且工作不通過引用並不斷修改同一個對象P/X/R。那麼如何及何時將其複製?那些第一行..我正在複製的參考不是我... (是的,我知道我「修改」newP然後循環在舊的P,他們只是指向它看起來相同的對象)
讀取的答覆後---新代碼 -
public int[] bk(List<Integer> r, List<Integer> p, List<Integer> x) {
int count[] = new int[n];
int u = 1;
List<Integer> tempPX = new ArrayList<Integer>();
List<Integer> newR, newP, newX;
if (p.isEmpty() && x.isEmpty()) {
count[r.size()]++;
} else {
// find vertex with largest degree in P U X
tempPX.addAll(p);
tempPX.addAll(x);
for (Integer v : tempPX) {
if (neighbours[v].size() > neighbours[u].size()) {
u = v;
}
}
p.removeAll(neighbours[u]); // P \ neighbours[u]
newP = new ArrayList<Integer>(p);
for (Integer v : newP) {
r.add(v); // R U v
newR = new ArrayList<Integer>(r);
p.retainAll(neighbours[v]); // P /\ neighbours[v]
newP = new ArrayList<Integer>(p);
x.retainAll(neighbours[v]); // X /\ neighbours[v]
newX = new ArrayList<Integer>(x);
bk(newR, newP, newX);
p.remove(v); // removing object
x.add(v); // X U v
}
}
return count;
}
您可以通過使用小寫字母變量來改善您的風格。另外,每行不要做多個聲明或分配。 – starblue 2010-07-03 09:56:19