4个字符串列表的所有可能组合[重复]
Posted
技术标签:
【中文标题】4个字符串列表的所有可能组合[重复]【英文标题】:All possible combinations of 4 lists of strings [duplicate] 【发布时间】:2015-09-18 11:44:14 【问题描述】:所以我有 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
【问题讨论】:
这不是 4 个字符串的列表,它们只有 2 个。另外,为什么语言不重要,解决方案会因语言而异。 @iharob > 这是 2 个字符串的 4 个列表... 列表的数量是否可变?或者是 4。 您是否希望第一个列表中的字符串始终出现在第二个列表中的字符串之前,第二个列表中的字符串始终出现在第三个列表之前,等等?是否要生成其他列表中的字符串也首先出现的组合? ...这被称为标签垃圾邮件,这表明您实际上是在询问“gimmetehcodez”,这在这里不太可能受到欢迎。 :-) 【参考方案1】:您可以使用递归方法。
在每一步中,您只处理一个列表,“猜测”要添加到目前解决方案中的元素,并递归处理“较小”的问题,减少一个列表:
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]
这种方法可以处理任意数量的此类列表,并且列表可以是任意大小,但请注意,解决方案的大小(和运行时间)是列表数量的指数,但这是意料之中的,因为任何试图通过所有组合的解决方案都必须经过指数级的组合。
【讨论】:
以上是关于4个字符串列表的所有可能组合[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从给定的单词列表中生成具有“N”长度的所有可能组合(寻找不重复)