0

再会,

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

基本上我使用的是 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 查找笛卡尔积和 PHP 关联数组找到了一个替代解决方案

4

1 回答 1

0

您的示例输出是您的三个数组的笛卡尔积的所有元组(不是permutations,它也会混合订单)。通常笛卡尔积是用嵌套循环构造的。

在 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]);
        }
    }
}

对于数组数量没有硬编码时的笛卡尔积,您可以构建一个包含所需所有索引的 2D m x n 数组;在这种情况下,m 将是数组长度的乘积,n 将是数组的数量。按照你的例子,这个数组看起来像

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

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

实际上,在Perfoming Cartesian product on arrays 上也回答了这个更一般的问题

于 2013-10-14T01:41:51.613 回答