一组随机变化的元素

时间:2017-05-08 18:50:39

标签: java set

由于某种原因,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;
}

}

1 个答案:

答案 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);
}