美好的一天,
目前,我正在尝试将多个数组中的字符串合并在一起,并形成一个无重复的排列。忠告?
基本上,我使用的是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