我需要按照指定的顺序列出特定集合中元素的组合。
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);
}
}
}
答案 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
)添加到其中而获得的列表。