我确信有一个CS术语用于我想要完成的任务,但我不确定它是什么。我有三个数组,我们称之为a
,b
和c
。我正在遍历每个可能的数组组合,这将是a*b*c
次迭代。
我传递的函数为当前迭代的int
(iteration
从0
变为a*b*c-1
)和a
的长度, b
和c
。我希望该函数能够打印出索引的每个唯一排列,仅根据迭代计数和a
,b
和c
的长度进行计算。
这就是我现在所拥有的:
class Test {
public static void printIndices(int i, int a, int b, int c) {
System.out.println(i%a + ", " + (i+1)%b + ", " + (i+2)%c);
}
public static void main(String[] args) {
int a[] = new int[2];
int b[] = new int[2];
int c[] = new int[3];
int iterations = a.length * b.length * c.length;
for (int i=0; i < iterations; i++){
printIndices(i, a.length, b.length, c.length);
}
}
}
它会生成此输出:
0, 1, 2
1, 0, 0
0, 1, 1
1, 0, 2
0, 1, 0
1, 0, 1
0, 1, 2
1, 0, 0
0, 1, 1
1, 0, 2
0, 1, 0
1, 0, 1
正如您所看到的那样,有重复的内容。我希望输出为:
0, 0, 0
1, 0, 0
0, 1, 0
1, 1, 0
0, 0, 1
1, 0, 1
0, 1, 1
1, 1, 1
0, 0, 2
1, 0, 2
0, 1, 2
1, 1, 2
(只要每个排列都没有重复,顺序就不重要了。)
显然我的输出线错了:
System.out.println(i%a + ", " + (i+1)%b + ", " + (i+2)%c);
获取我正在寻找的输出的正确操作是什么?
据我所知,这段代码看起来有些愚蠢,而且根本不是我实际做的,但它很好地证明了这一点。
答案 0 :(得分:4)
如评论中所述,您正在寻找Cartesian product。
使用模块化算法的方法几乎可行。您只需进行一些修改即可获得正确的结果:
System.out.println(i%a + ", " + (i/a)%b + ", " + (i/a/b)%c);
查看在线工作:ideone