【问题标题】:All possible combinations of 4 lists of strings [duplicate]4个字符串列表的所有可能组合[重复]
【发布时间】: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”,这在这里不太可能受到欢迎。 :-)

标签: java algorithm


【解决方案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]

这种方法可以处理任意数量的此类列表,并且列表可以是任意大小,但请注意,解决方案的大小(和运行时间)是列表数量的指数,但这是意料之中的,因为任何试图通过所有组合的解决方案都必须经过指数级的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2017-11-11
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多