【问题标题】:Combination Generator in JAVAJAVA中的组合生成器
【发布时间】:2015-05-28 09:41:26
【问题描述】:

我正在尝试查找多个数组中的所有项目组合。数组的数量是随机的(可以是 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 ...

【问题讨论】:

  • 使用二维数组传递可变数量的数组:String[][]
  • @Eran 好的,但这不是我正在寻找的解决方案,我需要的是生成组合。
  • 希望这会有所帮助:stackoverflow.com/a/30196382/3459206 有一个 Java 代码可以通过给定的不同长度的源数组生成所有可能的组合(next()generateWord() 方法可以很容易地应用于您的案例) .
  • 您想要计算输入数组的cartesian product。这可能(或可能不会)有助于找到现有的实现。 (只有一个example

标签: java loops for-loop while-loop


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2021-01-02
      • 2018-12-16
      相关资源
      最近更新 更多