Java 如何连接二维数组中的列?

Java 如何连接二维数组中的列?,java,arrays,algorithm,combinations,Java,Arrays,Algorithm,Combinations,如何连接二维数组中的列 a b c d 1 3 9 6 4 2 7 1 自动检查列数 例如: 如果有四列,则应考虑三个组合。 输出应为: 首先采取两种组合: ab ac ad bc bd cd 13 19 16 39 36 96 42 47 41 27 21 71 abc abd bcd acd 139 136 396 196 427 421 271 471 然后采取三种组合: ab ac ad bc bd cd 13 19 16 39 36 96 42 47 41 27 21 71 a

如何连接二维数组中的列

a b c d
1 3 9 6
4 2 7 1
自动检查列数

例如:

如果有四列,则应考虑三个组合。

输出应为:

首先采取两种组合:

ab ac ad bc bd cd
13 19 16 39 36 96
42 47 41 27 21 71
abc abd bcd acd
139 136 396 196
427 421 271 471
然后采取三种组合:

ab ac ad bc bd cd
13 19 16 39 36 96
42 47 41 27 21 71
abc abd bcd acd
139 136 396 196
427 421 271 471
我应该如何编写代码

下面是我试图获得这两种组合的代码。我需要如何更改它以获得上述输出

for (int i = 0; i < row.size(); i++) {
    for (int j = 0; j < col.size(); j++) {
        for (int k = j + 1; k < col.size(); k++) {
            array1.add(col[j]);
            array2.add(col[k]);
            array.add(array1.get(j) + array2.get(k));
        }
    }
    System.out.println("array");
}
for(int i=0;i
我发现这个问题很有趣,所以我花了一些时间来解决它。:)

以下是几点观察:

  • 对每行执行相同的组合,因此问题可以简化为组合一行的列,然后对每行应用相同的方法
  • 看起来您并不是在寻找所有排列,而是在寻找列与数组中后面的列组合在一起的子集。也就是说,您不想同时使用
    ab
    ba
    ,只需要
    ab
  • 结果应包括2..n-1列的组合(其中n为列数)。也就是说,您似乎不希望只需要1列(原始列)或n列(所有列的组合)
如果我们根据观察结果划分问题,则找到解决方案要简单得多:

  • 查找单行中所有列的组合。这个问题也可以分为两个方面:

    a) 从2..n-1(要组合的列数)迭代-我为
    级别
    调用了这个函数。也许不是最好的名字,但对我来说很有意义

    b) 查找当前
    级别的所有组合
    ,并将其添加到结果中

  • 将其应用于数组中的每一行,以生成最终的结果数组

  • 如果这些观察结果给了你一些想法,你可能想停止阅读这里,自己尝试一下。自己解决这类问题要比看一个完整的解决方案有趣得多。但是,如果您陷入困境,或者您已经解决了问题,并且希望看到另一个(可能不同的)解决方案,请继续阅读

    算法

    步骤1:将列合并到一行中

    a) 在级别2..n-1上迭代。级别指示要合并的列数

    b) 查找组合列的值

    请注意,第一列是从范围0..n-level中选择的。范围c1+1..n-level+1中的第二个(其中c1是所选第一列的索引)。范围c2+2..n级+2的第三个。依此类推,直到我们添加了正确数量的列

    c) 将组合列的值添加到结果中

    步骤2:将步骤1应用于输入数组中的每一行

    a) 迭代输入数组中的每一行

    b) 将步骤1应用于行

    c) 将结果行添加到输出数组

    实施

    第1步:
    RowCombine

    测试

    运行

    new ArrayCombine(new String[][]{
            { "a", "b", "c", "d"},
            { "1", "3", "9", "6"},
            { "4", "2", "7", "1"},
    }).print();
    
    产生

    ab ac ad bc bd cd abc abd acd bcd 
    13 19 16 39 36 96 139 136 196 396 
    42 47 41 27 21 71 427 421 471 271 
    
    ab ac ad ae bc bd be cd ce de abc abd abe acd ace ade bcd bce bde cde abcd abce abde acde bcde 
    13 19 16 15 39 36 35 96 95 65 139 136 135 196 195 165 396 395 365 965 1396 1395 1365 1965 3965 
    42 47 41 41 27 21 21 71 71 11 427 421 421 471 471 411 271 271 211 711 4271 4271 4211 4711 2711 
    
    它也适用于更高的尺寸,例如:

    new ArrayCombine(new String[][]{
            { "a", "b", "c", "d", "e"},
            { "1", "3", "9", "6", "5"},
            { "4", "2", "7", "1", "1"},
    }).print();
    
    产生

    ab ac ad bc bd cd abc abd acd bcd 
    13 19 16 39 36 96 139 136 196 396 
    42 47 41 27 21 71 427 421 471 271 
    
    ab ac ad ae bc bd be cd ce de abc abd abe acd ace ade bcd bce bde cde abcd abce abde acde bcde 
    13 19 16 15 39 36 35 96 95 65 139 136 135 196 195 165 396 395 365 965 1396 1395 1365 1965 3965 
    42 47 41 41 27 21 21 71 71 11 427 421 421 471 471 411 271 271 211 711 4271 4271 4211 4711 2711 
    

    如果有6列,您是否还需要其中4列和5列的所有组合,或者只需要其中2列和3列的组合?您的代码输出什么?您希望它输出什么?它对2个组合正确工作吗?您想将其扩展到3个(或更多),还是希望我们帮助您修复2个组合?我不理解构建组合的规则。或者你只是错过了其中的一些?组合的规则是他从4个中选择2到3个,顺序不重要,不允许重复。组合数为:n/(右)!(r!)@keshlam,而不是在标题中编辑关键字(特别是将它们放在括号中的末尾,我个人认为这是不合适的),你应该使用标签(虽然我个人不建议使用标签,因为我觉得这样做没有多大价值),或者将其编辑到问题正文的某个地方。