所以我有4个字符串列表:
List<String> a={"abc","def"};
List<String> b={"abc","def"};
List<String> c={"abc","def"};
List<String> d={"abc","def"};
从这4个列表生成所有可能的字符串组合的最佳方法是什么?
到目前为止,我已经使用非常基本的代码实现了这一点:
for(String i:a) {
for(String j:b) {
for(String k:c) {
for(String l:d) {
//do work
}
}
}
}
答案 0 :(得分:3)
您可以使用递归方法。
在每一步中,您只处理一个列表,“猜测”要添加到目前为止的解决方案中的哪个元素,然后递归一个“较小”的问题,减少一个列表:
public static <T> void getCombination(List<T>... lists) {
if (lists == null) return;
getCombinations(new ArrayList<T>(), 0, lists);
}
private static <T> void getCombinations(List<T> soFar, int i, List<T> ... lists) {
if (i == lists.length) { //no more lists left:
//do work on soFar, for example:
System.out.println(soFar);
}
else {
for (T t : lists[i]) {
soFar.add(t); //"guess" item
getCombinations(soFar, i+1, lists); //recurse on rest of lists
soFar.remove(soFar.size()-1); //cleanup
}
}
}
使用以下方式调用上述内容:
public static void main(String args[]) {
List<String> a= Arrays.asList("abc","def");
List<String> b= Arrays.asList("abc","def");
List<String> c=Arrays.asList("abc","def");
List<String> d=Arrays.asList("abc","def");
getCombination(a,b,c,d);
}
你会得到:
[abc, abc, abc, abc]
[abc, abc, abc, def]
[abc, abc, def, abc]
[abc, abc, def, def]
[abc, def, abc, abc]
[abc, def, abc, def]
[abc, def, def, abc]
[abc, def, def, def]
[def, abc, abc, abc]
[def, abc, abc, def]
[def, abc, def, abc]
[def, abc, def, def]
[def, def, abc, abc]
[def, def, abc, def]
[def, def, def, abc]
[def, def, def, def]
这种方法可以处理任意数量的此类列表,列表可以是任意大小,但请注意,解决方案的大小(和运行时间)是列表数量的指数,但这是预期的,因为任何尝试遍历所有组合的解决方案都必须经历指数数量的这种。