如何列出特定集合中元素的组合

时间:2018-03-30 09:09:13

标签: java recursion

我需要按照指定的顺序列出特定集合中元素的组合。

E.g。列表

  

[[a,b],[X,Y,Z],[1,2]]

应该返回:

  

[[a,X,1],[b,X,1],[a,Y,1],[b,Y,1],[a,Z,1],[b,Z,1 ], [一个,   X,2],[b,X,2],[a,Y,2],[b,Y,2],[a,Z,2],[b,Z,2]]

我尝试使用迭代解决它,但它只适用于这种情况下3个子列表的列表(如果我想使用6个子元素的函数,它将无法正常工作)。任何人都可以建议更灵活的递归解决方案吗?

    List<List<String>> result;
    List<List<String>> x;
    //filling the x list of lists
    List<String> tmp;
    for (int i = 0; i < x.get(2).size(); i++)
    {

        for (int j = 0; j < x.get(1).size(); j++)
        {
            for (int k = 0; k < x.get(0).size(); k++)
            {
                tmp = new List<>();
                tmp.add(x.get(0).get(k));
                tmp.add(x.get(1).get(j));
                tmp.add(x.get(2).get(i));

                result.add(tmp);
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

这可以通过重生来完成。

您需要的只是一个函数,它接受List<List<String>>作为输入,List<String>作为所有组合的公共前缀,List<List<String>>目标存储结果。

在函数内部,您应该从输入中获取第一个条目,对于此条目中的每个字符串,将其添加到前缀的副本,并使用新前缀和没有第一个条目的输入递归调用。

[[a, b], [c, d]] - input
[] - common prefix
[] - result

迭代[a, b],在每次迭代时递归调用。在第一次迭代中,您的函数将被调用,[c, d]作为输入,[a]作为公共前缀,第二次 - [c, d]作为输入,[b]作为公共前缀等。当输入只有一个元素时,不要迭代,只需将输入中公共前缀和条目的所有组合放入结果

答案 1 :(得分:0)

试试这个

private static void solve(List<List<String>> x, int item, List<String> combination) {
    if (item == x.size()) { // We have reached the end of the list i.e, traversed all rows 
        result.add(combination);
        return;
    }

    for (int i = 0; i < x.get(item).size(); i++) {
        List<String> current = new ArrayList<>(combination);
        current.add(x.get(item).get(i));
        solve(x, item + 1, current);
    }
}
solve(x, 0, new ArrayList<>());

逻辑的核心是进行递归调用,传递通过复制combination列表并将当前列表的每个元素(item)添加到其中而获得的列表。