java - JAVA组合生成器

标签 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 ...

最佳答案

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

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)

关于java - JAVA组合生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30502830/

相关文章:

javascript - 使用 for 循环创建包含对象数组的对象

java - java最大和最小输入的建议

Java线程: start and sleep threads at random time

loops - 在 Ansible 中跳过整个循环

java - 更改 MultiKeyMap 的每个值 (Apache Commons)

java - java中的数组循环

Javascript:使用循环为图像的 URL 填充数组

Java midi SysEx 消息,流卡住,可能的错误?

java - 将 Swing JDialog 设置为非模式

java - java 中 b=+1 的不同输出