由于某种原因,Set的一个元素随机变化而我的代码在任何时候都没有改变。不知道为什么Set会改变:
[[red,green],[green,red],[red,red],[green,green]]
到
[[green,red],[green,red],[red,red],[green,green]]
无缘无故。
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class Fermat {
public static void main(String[] args) {
Set<String> colours = new HashSet<String>();
colours.add("red");
colours.add("green");
analyse(threadings(2, colours));
}
public static Set<ArrayList<String>> threadings(int n, Set<String> s) {
Set<ArrayList<String>> combos = new HashSet<ArrayList<String>>();
if (n < 0) {
combos.add(new ArrayList<String>());
return combos;
} else {
int[] index = new int[s.size()];
do {
ArrayList<String> newCombo = new ArrayList<String>();
for (int i = 0; i < n; i++) {
newCombo.add(s.toArray(new String[s.size()])[index[i]]);
}
combos.add(newCombo);
index[index.length - 1]++;
for (int i = (index.length - 1); i > 0; i--) {
if (index[i] >= s.size()) {
index[i] = 0;
index[i - 1]++;
}
}
} while (index[0] < s.size());
return combos;
}
}
public static boolean isEquiv(ArrayList<String> a, ArrayList<String> b) {
if (a.size() != b.size()) {
return false;
} else {
for (int i = 0; i < a.size(); i++) {
if (a.equals(b)) {
return true;
}
Collections.rotate(a, 1);
}
return false;
}
}
public static void analyse(Set<ArrayList<String>> s) {
Set<ArrayList<String>> singletons = new HashSet<ArrayList<String>>();
ArrayList<ArrayList<String>> combos = new ArrayList<ArrayList<String>>();
for (ArrayList<String> combo : s) {
System.out.println(s);
if (singleton(combo, s)) {
singletons.add(combo);
}
}
System.out.println(singletons);
}
public static boolean singleton(ArrayList<String> c, ArrayList<ArrayList<String>> cs) {
for (int i = 0; i < cs.size(); i++) {
{
if (isEquiv(c, cs.get(i)) && !c.equals(cs.get(i))) {
return false;
}
}
}
return true;
}
}
答案 0 :(得分:0)
您正在使用Collections.rotate(a, 1)
改变列表。在这种情况下,它最终会在某个时刻将[red, green]
转换为[green, red]
,这会影响对该列表对象的每个引用。
您需要创建一个新列表并将其旋转,以便不更改原始列表对象。像这样:
ArrayList<String> a2 = new ArrayList<>(a);
for (int i = 0; i < a2.size(); i++) {
if (a2.equals(b)) {
return true;
}
Collections.rotate(a2, 1);
}