【问题标题】:Specific array elements combinations特定数组元素组合
【发布时间】:2018-08-29 22:23:27
【问题描述】:

我有一个字符串值的二维数组:

ABC
-D-
-FG

其中“-”表示空值。 我想要实现的是“从左到右”获取数组元素的所有组合,所以给定数组的结果应该是:

ABC
ADC
亚足联
AFG
ABG
总干事

应省略空值并保持项目的顺序。 问题是数组的列数和行数不固定。 我试图玩循环(和循环)和递归,但没有成功。在这种情况下,笛卡尔积也是无用的,因为它会产生不必要的组合(我尝试动态创建 sql 临时表并将值存储在其中进行交叉连接)。 请问有人给我指路吗?

【问题讨论】:

  • ABCG 等在哪里?看起来 G 处于第 4 位。 (我用文字替换了你的截图,但请参考i.stack.imgur.com/LNClv.png,如果我错了,请纠正我......)
  • ABCG 不是必需的。我们只构建与数组列数一样多的字符。从左到右。如果数组有 4 列,则需要第 4 个字符。
  • 但是第 3 行有 4 列。如果第三行是“-FG”,组合会有什么不同?
  • 你是对的,每行应该有 3 列。第三行应该是-FG。这是我的错误,对不起。
  • 好的,为你编辑

标签: arrays vb.net combinations


【解决方案1】:

如果我正确理解您的要求,您可以通过使用一个数组来为每一列保存包含要输出的值的行的索引来做到这一点。最初,此数组将保存每列的第一个非空行。在每次迭代中,从最低列开始递增要索引的行,直到获得非空值或到达行尾,在这种情况下,将行设置回第一个非空值并转到下一列。这类似于汽车中旧里程表的动作。

这里有一些Java代码来说明(对不起,我不熟悉VB.Net)

    char[][] values = {
            {'A', 'B', 'C'}, 
            {'-', 'D', '-'}, 
            {'-', 'F', 'G'}
            };

    int rows = values.length;
    int cols = values[0].length;

    int[] idx = new int[cols];

    // for each column, find the first non-empty character
    int i=0;
    for(; i<cols; i++)
    {
        while(idx[i] < rows && values[idx[i]][i] == '-') idx[i]++;
        if(idx[i] == rows) break;
    }

    // if a column was missing a non-empty value then we can't proceed
    if(i<cols) 
    {
        System.out.println("Missing value in column " + i);
        return;
    }

    while(true)
    {
        // print current solution
        for(int j=0; j<cols; j++) 
            System.out.print(values[idx[j]][j]);
        System.out.println();

        int k=0;
        for(; k<cols; k++)
        {
            // find next non-empty character
            do idx[k]++; while(idx[k] < rows && values[idx[k]][k] == '-');

            // if there was one, break
            if(idx[k] < rows) break;

            // else, wrap around to 0, but then find next non-empty row
            idx[k] = 0;
            while(values[idx[k]][k] == '-') idx[k]++;
        }

        // if the last index wrapped around then we're done
        if(k == cols) break;
    }

输出:

ABC
ADC
AFC
ABG
ADG
AFG

【讨论】:

  • 对大型数据集的可能增强:在主处理之前挤压列以使列数为{{'A', 'B', 'C'}, {'-', 'D', 'G'}, {'-', 'F', '-'}}; 的列数为{1,3,2},以避免在主循环内进行即时检查。
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2019-04-18
  • 2018-05-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多