Java 4个字符串列表的所有可能组合

Java 4个字符串列表的所有可能组合,java,algorithm,Java,Algorithm,所以我有4个字符串列表: List<String> a={"abc","def"}; List<String> b={"abc","def"}; List<String> c={"abc","def"}; List<String> d={"abc","def"}; 您可以使用递归方法 在每一步中,您只处理一个列表,猜测要添加到目前为止的解决方案中的元素,然后在一个较小的问题上递归,使用较少的列表: public static <T>

所以我有4个字符串列表:

List<String> a={"abc","def"};
List<String> b={"abc","def"};
List<String> c={"abc","def"};
List<String> d={"abc","def"};

您可以使用递归方法

在每一步中,您只处理一个列表,猜测要添加到目前为止的解决方案中的元素,然后在一个较小的问题上递归,使用较少的列表:

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 <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
        }
    }
}

这种方法可以处理任意数量的此类列表,并且列表可以是任意大小的,但是请注意,解决方案的大小和运行时间与列表的数量成指数关系,但这是意料之中的,因为任何试图通过所有组合进行路径选择的解决方案都必须通过这样的指数数。

这不是一个包含4个字符串的列表,它们只有2个。还有,为什么语言无关紧要,解决方案会因语言的不同而大不相同。@iharob>这是一个由2个字符串组成的4个列表……列表的数量会变化吗?或者是4。是否希望第一个列表中的字符串始终显示在第二个列表中的字符串之前,第二个列表中的字符串始终显示在第三个列表中的字符串之前,等等。?当然,您是否希望在其他列表中的字符串也首先出现的位置生成组合?…这称为标记垃圾邮件,这表明,您本质上是在询问gimmetehcodez,这在这里可能不太受欢迎:-这不是4个字符串的列表,它们只是2个。还有,为什么语言无关紧要,解决方案会因语言的不同而大不相同。@iharob>这是一个由2个字符串组成的4个列表……列表的数量会变化吗?或者是4。是否希望第一个列表中的字符串始终显示在第二个列表中的字符串之前,第二个列表中的字符串始终显示在第三个列表中的字符串之前,等等。?当然,您是否希望在其他列表中的字符串也首先出现的位置生成组合?…这称为标记垃圾邮件,这表明,您本质上是在询问gimmetehcodez,这在这里可能不太受欢迎:-
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]