java - 组合发电机

标签 java loops recursion while-loop combinations

我有一个多维数组,其大小是动态的。

String[][] array=new String[][]{{"1","2","3"},{"4","5","6"},{"7","8","9"},{"10","11","12"} };

我需要生成组合,例如每个组合长度必须位于 1-array.length 之间,并且每个组合在一行中最多可以有一个元素。如果使用行中的一列,则该行中的其他列不能用于该组合。

例如 长度为 1 的组合是:

1
2
3
4
5
6
7
8
9
10
11
12

长度为 2 的组合为:

1,4
1,5
1,6
1,7
1,8
1,9
1,10
1,11
1,12

目前我只能得到 length = array.length 的组合,但我需要长度从 1 到 array.length

private String[][] generateCombinations(String[]... arrays) throws Throwable       {
    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 = 0; j < arrays.length; 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;
}

最佳答案

你喜欢 1 个字母的变量名吗...? :D 我什至不知道它现在是如何工作的。它使用位掩码来查找长度为 n 的子数组的每个组合;然后它使用一些 mod 数学从每个子数组中查找 1 的每个组合;然后它会吐出这个数字。排序顺序并不理想。

public class Perms {
    private static String[][] array = new String[][] {
        { "1", "2", "3" },
        { "4", "5", "6" },
        { "7", "8", "9" },
        { "10", "11", "12" }
    };
    private static int combinationLength = 2;
    public static void main(String[] args) {
        // Get combinations of subarrays
        for (int i = 0; i < Math.pow(2, array.length); ++i) {
            int c = 0;
            for (int j = 1; j <= Math.pow(2, array.length); j <<= 1)
                if ((i & j) != 0)
                    ++c;
            if (c == combinationLength) {
                String[][] maskedArray = new String[combinationLength][];
                for (int l = 1, j = 0, k = 0; l <= Math.pow(2, array.length); l <<= 1, ++j)
                    if ((i & l) != 0) {
                        maskedArray[k] = array[j];
                        ++k;
                    }
                // Get combinations of one element per subarray
                int l = 1;
                for (int j = 0; j < maskedArray.length; ++j)
                    l *= maskedArray[j].length;
                for (int j = 0; j < l; ++j) {
                    String s = "";
                    int m = j;
                    for (int k = maskedArray.length-1; k >= 0; --k) {
                        s = maskedArray[k][m % maskedArray[k].length] + "," + s;
                        m /= maskedArray[k].length;
                    }
                    // Spit out a result
                    System.out.println(s.substring(0, s.length()-1));
                }
            }
        }
    }
}

关于java - 组合发电机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31018380/

相关文章:

loops - 在 Makefile 中循环 ifndef/endif 结构

python - 如何使用 BeautifulSoup 迭代站点上的多个内部链接以输出所有电子邮件地址?

javascript - 将javascript对象转换为有序的逗号分隔值

python - 使用记忆化的递归算法

java - 如何为 OSX 和 Gatekeeper 签署(动态)JNLP 文件

java - 输出解析后的Json数据

java - AKKA 消息超时

python - 如何退出这个 while 循环?

javascript - 递归 JSON.stringify 实现

java - Google 图表导出为 PDF