美好的一天,

目前,我正在尝试将多个数组中的字符串合并在一起,并形成一个无重复的排列。忠告?

基本上,我使用的是PHP / GWT / MySQL,但是我欢迎其他可以帮助您完成此操作的语言。
谢谢 :)

例:

array(1, 2, 3);
array(a, b, c);
array(!,@,#);
...


应得:

1)  1a!
2)  1a@
3)  1a#
4)  1b!
5)  1b@
6)  1b#
7)  1c!
8)  1c@
9)  1c#
10) 2a!
11) 2a@
12) 2a#
13) 2b!
14) 2b@
15) 2b#
16) 2c!

...


================================================== ===========================
更新

另外,我找到了使用PHP的替代解决方案
Finding cartesian product with PHP associative arrays

最佳答案

您的示例输出是三个数组的笛卡尔乘积的所有元组(而不是排列,排列也会混合顺序)。通常,笛卡尔积是用嵌套循环构造的。

在Java(GWT)中,可以这样进行。

List<String> result = new ArrayList<String>();
for(int i=0; i<array1.length; i++) {
    for(int j=0; j<array1.length; j++) {
        for(int k=0; k<array1.length; k++) {
            result.add(array1[i]+array2[j]+array3[k]);
        }
    }
}


对于笛卡尔积,当数组的数量不是硬编码的时,您可以构建一个二维的m×n数组,其中包含所需的所有索引;在这种情况下,m将是数组长度的乘积,n将是数组的数量。按照您的示例,此数组看起来像

0, 0, 0
0, 0, 1
0, 0, 2
0, 1, 0
0, 1, 1
...


构造此数组需要一些簿记。我会逐列进行。例如,如果您有三个长度分别为l1,l2和l3的数组,则最后一列是根据循环索引mod l3构造的。第二列具有来自循环索引mod 12的值,但每个值重复13次。第一列具有值mod l1,但每个值重复l2 * l3次。您可以使用计数器来构建重复的值:一个用于行号,一个用于值:例如,当行号mod l3为零时,增加该值的计数器,以便每个值获得l3行。

实际上,这个更普遍的问题也可以在
Perfoming Cartesian product on arrays

10-04 18:21