查找数组索引

时间:2012-06-18 17:22:56

标签: java arrays

我确信有一个CS术语用于我想要完成的任务,但我不确定它是什么。我有三个数组,我们称之为abc。我正在遍历每个可能的数组组合,这将是a*b*c次迭代。

我传递的函数为当前迭代的intiteration0变为a*b*c-1)和a的长度, bc。我希望该函数能够打印出索引的每个唯一排列,仅根据迭代计数和abc的长度进行计算。

这就是我现在所拥有的:

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);

获取我正在寻找的输出的正确操作是什么?

据我所知,这段代码看起来有些愚蠢,而且根本不是我实际做的,但它很好地证明了这一点。

1 个答案:

答案 0 :(得分:4)

如评论中所述,您正在寻找Cartesian product

使用模块化算法的方法几乎可行。您只需进行一些修改即可获得正确的结果:

System.out.println(i%a + ", " + (i/a)%b + ", " + (i/a/b)%c);

查看在线工作:ideone