可变数量项目的所有可能的x部分组合

时间:2013-11-26 02:19:47

标签: java

如果我得到这样的数组:

String[] items = { "Cat", "Frog", "Dog", "Ferret"};

例如,在这种情况下,所有3项组合都是(如果我没有错过):

String[][] combinations = { 
{ "Cat", "Frog", "Dog" }, 
{ "Cat", "Dog", "Ferret" },
{ "Cat", "Frog", "Ferret" }, 
{ "Frog", "Dog", "Ferret" } };

如何使用java方法获取可变数量项的所有可能的x项组合?

2 个答案:

答案 0 :(得分:1)

您可以使用combinatoricslib

apache commons math开发版中还有一个生成整数组合的函数:CombinatoricsUtils.combinationsIterator (3.3)

您可以使用该函数为您生成索引String数组,然后使用这些索引以实际值填充数据。

public static Iterator<int[]> combinationsIterator(int n, int k)
     

返回一个迭代器,其范围是{0,...,n的k元素子集    - 1}表示为int []数组。迭代器返回的数组按降序排序,并以字典形式访问它们   顺序从右到左有意义。例如,   combinationIterator(4,2)返回一个将生成的Iterator   在对next()的连续调用中遵循数组序列:[0,1],   [0,2],[1,2],[0,3],[1,3],[2,3]

修改

正如OP提到的,这是一个开发版本,所以要下载你必须从这里检查他们的来源:source然后自己构建(使用maven)

答案 1 :(得分:0)

我解决了这个问题:

static void combinations2(String[] arr, int len, int startPosition, String[] result, ArrayList<String[]> allResults){
    if (len == 0){
        String[] copy = new String[result.length];
        System.arraycopy(result,0,copy,0,result.length);
        allResults.add(copy);
        return;
    }
    for (int i = startPosition; i <= arr.length-len; i++){
        result[result.length - len] = arr[i];
        combinations2(arr, len-1, i+1, result, allResults);
    }
}

用法示例:

ArrayList<String[]> allResults = new ArrayList<String[]>();
String[] items = { "Cat", "Frog", "Dog", "Ferret"};
combinations2(items, 3, 0, new String[3], allResults);