2D阵列的所有可能的组合[重复](All possible combinations of a 2D

2019-06-26 00:51发布

这个问题已经在这里有一个答案:

  • 生成所有可能的组合 11个回答

我要生成从2D [m×n个]阵列中的所有可能的组合,除了每个阵列的第一个元素。 该元素将站在为“型”,表示其余的元素。 举例来说,如果我有一个数组

shirts[][] = 
{
  {"colour", "red", "blue", "green", "yellow"},
  {"cloth", "cotton", "poly", "silk"},
  {"type", "full", "half"}
};

所期望的输出应的衬衫的所有可能性的组合。 对于上面的例子,

colour red
colour blue
...
cloth silk
type full
type half
colour red cloth cotton
colour red cloth poly
...
colour yellow type half
cloth cotton type full
...
cloth silk type half
colour red cloth cotton type full
...
colour yellow cloth silk type half

我想这样的事情(也帮助了其他堆栈溢出问题 )

String shirts[][] = 
{
  {"colour", "red", "blue", "green", "yellow"},
  {"cloth", "cotton", "poly", "silk"},
  {"type", "full", "half"}
};

majorCombinations = new int[possibilities][shirts.length];

int currentCombination;
int offset = 1;

for (int i=0; i < shirts.length; i++)
{
    currentCombination = 0;
    while (currentCombination < possibilities)
    {
        for (int j=0; j < shirts[i].length; j++)
        {
            for (int k=0; k < offset; k++)
            {
                if (currentCombination < possibilities)
                {
                    majorCombinations[currentCombination][i] = shirts[i][j];
                    currentCombination++;
                }
            }
        }
    }
    offset *= shirts[i].length;
}

但它给了所有N组合的值,即只

colour cloth type
colour cloth full
...
yellow silk half

它并没有考虑到更小的组合,这是不即使对于[m×n个]数组通用即(N不必是固定的)。 在VBA中帮助将得到高度赞赏。 我很舒服与C,Java和C#。 提前致谢 :)

编辑:

这比不同在这里问的问题 。 这个人是不是一个笛卡尔积,其中一个元件来从所讨论每个阵列服用。 我需要不把这个限制的输出; 因此组合的此方案中的数>在链接的问题的组合数。 此外,第一列是内容的一个描述符,并且必须随内容。

Answer 1:

链接到原来的答案

两个数组两个嵌套的循环应该做的:

for (int i = 0 ; i != c[0].length ; i++) {
    for (int j = 0 ; j != c[1].length ; j++) {
        System.out.writeln(""+c[0][i]+c[1][j]);
    }
}

欲了解更多的嵌套,你需要一个递归或等效的基于堆栈的解决方案。

void combos(int pos, char[][] c, String soFar) {
    if (pos == c.length) {
         System.out.writeln(soFar);
         return;
    }
    for (int i = 0 ; i != c[pos].length ; i++) {
        combos(pos+1, c, soFar + c[pos][i]);
    }
}


Answer 2:

是你想要的,一个笛卡尔积?

var colours = new[]{"colour - red", "colour - blue", "colour - green", "colour - yellow"};
var cloth = new[] {"cloth - cotton", "cloth - poly", "cloth - silk"};
var type = new[]{"type - full", "type - half"};

var combinations = from c in colours
                   from cl in cloth
                   from t in type
                   select new[]{c, cl, t};


Answer 3:

for (int i = 0; i < shirts[0].length; i++) {
        for (int j = 0; j < shirts[1].length; j++) {
            for (int k = 0; k < shirts[2].length; k++) {
if (i != 0)
                    System.out.print(shirts[0][0] + " " + shirts[0][i]
                            + " ");
                if (j != 0)
                    System.out.print(shirts[1][0] + " " + shirts[1][j]
                            + " ");
                if (k != 0)
                    System.out.print(shirts[2][0] + " " + shirts[2][k]
                            + " ");
                System.out.println();
            }
        }

    }
}


文章来源: All possible combinations of a 2D array [duplicate]