0

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

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

我想找到所有组合:

1) 组合 a1 a2 静脉与 a2 a1 等相同

2)每个结果集的元素数量不固定:组合的可能性是例如将所有列表合并为一个..或将每个列表中的每个元素合并到自己的列表中,或将列表中的两个元素合并到另一个列表中..和很快..

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

4

2 回答 2

1

这是我不久前为此目的实现的一个实用程序类。它使用数组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;
    }

}
于 2013-06-16T15:23:51.503 回答
0

我为自己做了类似的事情,但这会给你 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));
    }

}

使用这种逻辑,您必须将您的列表变成一个长字符串,然后将此方法发送到您的字符串

于 2013-06-16T14:33:09.810 回答