【问题标题】:Combination in java [duplicate]java中的组合[重复]
【发布时间】:2014-09-17 15:21:18
【问题描述】:

我有一个包含 3 个数组的数组,如下所示:

String[][] S = { {a,b,c} , {d,e}, {f,g,h} }

现在我要创建所有数组

R = {r1,r2,r3}

其中r1 属于S1r2 属于S2r3 属于S3(S1、S2、S3 是 S 的子数组),我想要输出如下那:

R1 = {S[1][1], S[2][1], S[3][1]},
R2 = {S[1][1], S[2][1], S[3][2]},
R3 = {S[1][1], S[2][1], S[3][3]},
...,
R18 = {S[1][3], S[2][2], S[3][3]}

我不能使用 3 个 for 迭代器,因为数组 S 是动态的。

【问题讨论】:

  • 我不能使用 3 个 for 迭代器,因为数组 S 是动态的 这就是 .length 属性的用途。
  • 我不完全理解你的问题,但似乎你更习惯于其他编程语言。在 java 中,比数组(顺便说一下从零开始)还有更多的工作要做。您可以使用 java.util 中的任何内容,甚至可以使用 google guava 库来累积、转换等。您对要实现的算法有参考吗?解释有点困难。
  • S 的长度是动态的这一事实并不意味着您不能使用for 循环。为什么这也被归类为遗传算法?
  • 感谢您的评论,但我认为我的问题很明确。 理解您自己的问题并不困难。如果有人要求澄清,通常是因为需要。
  • 所以让我直截了当:S 是一个“向量的向量”,每个S[j] 可以有不同的长度。我没有看到使用 for{} 循环的任何限制

标签: java arrays algorithm combinations


【解决方案1】:

这是一个使用递归的解决方案。

private static void fillArray(List<String> prefix, String[][] s, List<String[]> allResults){
    if(prefix.size() < s.length) {
        String[] currentArray = s[prefix.size()];
        for (String currentString : currentArray) {
            LinkedList<String> copy = new LinkedList<>(prefix);
            copy.add(currentString);
            fillArray(copy,s,allResults);
        }
    } else {
        allResults.add(prefix.toArray(new String[prefix.size()]));
    }
}

使用它调用:

    String[][] S = { {"a","b","c"} , {"d","e"}, {"f","g","h"} };
    List<String[]> allResults = new LinkedList<>();
    fillArray(new LinkedList<String>(),S,allResults);

    for (String[] result: allResults) {
        System.out.println(Arrays.toString(result));
    }

编辑:

这是你想要的方法:

private static void fillArray2(List<String> prefix, String[][] s, List<String[]> allResults){
    if(prefix.size() < s.length) {
        String[] currentArray = s[prefix.size()];
        for(int i=0;i<currentArray.length;i++) {
            LinkedList<String> copy = new LinkedList<>(prefix);
            copy.add("S["+(prefix.size()+1)+"]["+(i+1)+"]");
            fillArray2(copy,s,allResults);
        }
    } else {
        allResults.add(prefix.toArray(new String[prefix.size()]));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2016-08-10
    • 2014-03-31
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多