Java 组合生成

Java Combination Generation

我想看看 java 是否有一些我可以利用的组合学特征。我想要一个动态列表,并且以一种干净的方式让 java 生成所有组合。

给定一个对象列表,比如下面的字符串。是否有一个简单的 way/clean way/preferably 已经内置到核心 java 中的东西来生成项目的所有组合?例如如果我有:

List<String> items = new ArrayList<String>();
items.add("a");
items.add("b");
List<List<String>> result = generateCombinationOf(items);

我希望结果包含:{{}, {"a"}, {"b"}, {"a", "b"}}

旁注: 过去我能够在 Mathematica 中生成这样的列表。我有一个我想利用 java 的业余项目,我希望尽可能避免与 Mathematica 集成,但如果我找不到像上面那样容易获得的一些功能,我会这样做。

试试这个。

static void generateCombinationOf(List<String> items,
        List<String> selected, int index, List<List<String>> result) {
    if (index >= items.size()) {
        result.add(new ArrayList<>(selected));
    } else {
        generateCombinationOf(items, selected, index + 1, result);
        selected.add(items.get(index));
        generateCombinationOf(items, selected, index + 1, result);
        selected.remove(selected.size() - 1);
    }
}

static List<List<String>> generateCombinationOf(List<String> items) {
    List<List<String>> result = new ArrayList<>();
    List<String> selected = new ArrayList<>();
    generateCombinationOf(items, selected, 0, result);
    return result;
}

System.out.println(generateCombinationOf(Arrays.asList("a", "b")));

结果

[[], [b], [a], [a, b]]

非递归版本

static List<List<String>> generateCombinationOf(List<String> list) {
    List<List<String>> result = new ArrayList<>();
    for (int i = 0, max = 1 << list.size(); i < max; ++i) {
        List<String> comb = new ArrayList<>();
        for (int j = 0, k = i; k > 0; ++j, k >>= 1)
            if ((k & 1) == 1)
                comb.add(list.get(j));
        result.add(comb);
    }
    return result;
}