找出所有的组合和排列-Java

找出所有的组合和排列-Java,java,combinations,permutation,Java,Combinations,Permutation,我是新来的,也是个初学者。我正在做一个个人项目(开发一个个人应用程序)。我有点卡住了,是的,我确实到处找过,但找不到太多。 我的目标是找到所有可能的组合。假设我有一个有限数量的列表,定义如下: List<String> AList contains {"a1","a2","a3","a4"} List<String> BList contains {"b1","b2","b3"} List<String> CList contains {"c1","c2"

我是新来的,也是个初学者。我正在做一个个人项目(开发一个个人应用程序)。我有点卡住了,是的,我确实到处找过,但找不到太多。 我的目标是找到所有可能的组合。假设我有一个有限数量的列表,定义如下:

List<String> AList contains {"a1","a2","a3","a4"} 
List<String> BList contains {"b1","b2","b3"} 
List<String> CList contains {"c1","c2","c3","c4","c5"} 
List<String> DList contains {"d1","d2"}
列表列表包含{“a1”、“a2”、“a3”、“a4”}
列表BList包含{“b1”、“b2”、“b3”}
列表CList包含{“c1”、“c2”、“c3”、“c4”、“c5”}
列表数据列表包含{“d1”,“d2”}
我希望找到以下所有组合:

1) a1和a2的组合与a2和a1相同,依此类推

2) 每个结果集的元素数不固定:每个示例都有可能将所有列表合并为一个。。或者列表中的每个元素都有自己的元素,或者将列表中的两个元素合并到另一个元素中。。等等


我知道它必须是一个递归函数。。但这就是我现在能走多远。。任何帮助都将不胜感激。谢谢

我为自己做了类似的事情,但是这会给你a1 a2等的排列,而不是组合,这意味着顺序不重要

public void permutation(String prefix, String str) {
    int n = str.length();
    if (n==0){}
    else {
        for (int i = 0; i < n; i++)
            permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
    }

}
public void置换(字符串前缀,字符串str){
int n=str.length();
如果(n==0){}
否则{
对于(int i=0;i

使用此逻辑,您必须将列表转换为一个长字符串,然后将字符串发送给此方法。这是我不久前为此目的实现的实用程序类。它使用
int
数组而不是
String
列表,但它应该让您了解:

public final class Math {

    private Math() {
    }

    public static int[][] ncks(int n, int k) {
        int[] ks = new int[k];
        for (int i = 0; i < ks.length; i++) {
            ks[i] = i + 1;
        }

        int[][] ncks = new int[nck(n, k)][];

        boolean done = false;
        for (int j = 0; !done; j++) {
            ncks[j] = Arrays.copyOf(ks, ks.length);
            done = getNext(ks, n, k);
        }
        return ncks;
    }

    private static int nck(int n, int k) {
        int d = 1;
        int r = 1;

        int m = java.lang.Math.max(k, n - k) + 1;
        for (; m <= n; m++, d++) {
            r *= m;
            r /= d;
        }
        return r;
    }

    private static boolean getNext(int[] num, int n, int k) {
        int target = k - 1;

        num[target]++;
        if (num[target] > ((n - (k - target)) + 1)) {
            while (num[target] > ((n - (k - target)))) {
                target--;
                if (target < 0) {
                    break;
                }
            }

            if (target < 0) {
                return true;
            }

            num[target]++;
            for (int i = target + 1; i < num.length; i++) {
                num[i] = num[i - 1] + 1;
            }
        }
        return false;
    }

}
公共期末数学{
私人数学{
}
公共静态int[]ncks(int n,int k){
int[]ks=新的int[k];
对于(int i=0;i((n-(k-target))){
目标--;
如果(目标<0){
打破
}
}
如果(目标<0){
返回true;
}
num[目标]+;
for(int i=target+1;i
我建议您使用Guava library的Collection2类,而不是编写自己的方法来生成排列和组合。有太多类似于重复元素的情况,如果您编写自己的代码,则需要处理更多的情况。指向番石榴图书馆的链接:收藏2:@SamithaChathuranga在维基百科中查看