从多个列表中生成所有组合

给定未知数量的列表,每个列表的长度未知,我需要生成一个包含所有可能的唯一组合的单一列表。例如,给定以下列表:

X: [A, B, C] 
Y: [W, X, Y, Z]

然后我应该能够生成12个组合:

[AW, AX, AY, AZ, BW, BX, BY, BZ, CW, CX, CY, CZ]

如果添加第三个包含 3 个元素的列表,我将有 36 个组合,依此类推。

关于如何在Java中做到这一点的任何想法?
(伪代码也很好)


答案 1

您需要递归:

假设您的所有列表都在 中,这是一个列表列表。让我们成为所需排列的列表。你可以像这样实现它:listsresult

void generatePermutations(List<List<Character>> lists, List<String> result, int depth, String current) {
    if (depth == lists.size()) {
        result.add(current);
        return;
    }

    for (int i = 0; i < lists.get(depth).size(); i++) {
        generatePermutations(lists, result, depth + 1, current + lists.get(depth).get(i));
    }
}

最终的调用将如下所示:

generatePermutations(lists, result, 0, "");

答案 2

此操作称为笛卡尔积。Guava为此提供了一个实用程序功能:Lists.cartesianProduct。