JAVA中的组合发生器

时间:2015-05-28 09:41:27

标签: java loops for-loop while-loop

我试图找到几个数组中的所有项目组合。数组的数量是随机的(可以是2,3,4,5 ......)。每个数组中的元素数也是随机的。

例如,我有3个数组:

String[][] array1 = {{"A1","A2","A3"},{"B1","B2","B3"},{"C1","C2"}};

我想生成一个包含所有可能组合的数组:

A1, B1, C1
A1, B1, C2
A1, B2, C1
A1, B2, C2
A1, B3, C1
A1, B3, C2
A2, B1, C1
A2, B1, C2 ...

2 个答案:

答案 0 :(得分:1)

您可以使用“类似计数器”策略创建组合,即将这些数组视为数字的数字,如下所示:

public static String[][] generateCombinations(String[]... arrays) {
    if (arrays.length == 0) {
        return new String[][]{{}};
    }
    int num = 1;
    for (int i = 0; i < arrays.length; i++) {
        num *= arrays[i].length;
    }

    String[][] result = new String[num][arrays.length];

    // array containing the indices of the Strings
    int[] combination = new int[arrays.length];

    for (int i = 0; i < num; i++) {
        String[] comb = result[i];
        // fill array
        for (int j = 0; j < arrays.length; j++) {
            comb[j] = arrays[j][combination[j]];
        }

        // generate next combination
        for (int j = arrays.length-1; j >= 0; j--) {
            int n = ++combination[j];
            if (n >= arrays[j].length) {
                // "digit" exceeded valid range -> back to 0 and continue incrementing
                combination[j] = 0;
            } else {
                // "digit" still in valid range -> stop
                break;
            }
        }
    }
    return result;
}

这个方法的调用如下:

generateCombinations(
            new String[]{"A1","A2","A3"},
            new String[]{"B1","B2","B3"},
            new String[]{"C1","C2"}
       )

或者像这样:

generateCombinations(array1)

答案 1 :(得分:0)

变量循环嵌套有两种基本方法。一个是明确的簿记,正如先前answer中所讨论的那样。另一种是递归解决方案。在递归解决方案中,递归方法的激活将局部变量存储为与簿记方法中的显式数组中跟踪的索引数据相同的索引数据。

如果输入包含零数组,则递归的基本情况是返回长度为0的结果数组。如果输入包含一个或多个数组,则从第一个数组的元素生成结果,并为其余数组生成递归调用结果。