Java是否足以检查其唯一性?

时间:2013-11-18 06:08:00

标签: java arrays loops

    double[] a = new double[size];
    for (int i = 0; i < size; i++) {
        double randomNum = Math.random() * 100;
        a[i] = randomNum;
        for (int j = 0; j < i; j++) {
            if (a[i] == a[j]) {
                i--;
                break;
            }
        }

我上面有一段代码,用于检查数组中double的唯一性。我已经运行了几次我的程序,结果是我想要的。

但是,我回过头来追踪该程序,可能在代码中发现了一个缺陷。如果相同的数字连续两次随机生成,我认为上面的代码会失败。假设第一个双精度是1.0,那么接下来的两个随机生成的双精度恰好也是1.0 ...由于{{1}的条件,内部for循环永远不会被执行从1递减到0,因此对于生成的第二个数字,检查将失败。

有人确认这是否属实,因为我不熟悉Java。

3 个答案:

答案 0 :(得分:1)

不,你拥有的是正确的。内部循环将在您刚刚生成的数字之前运行到索引。如果你刚刚生成了[5],内部循环会将[5]与[0],[1],a [2],a [3]和[4]进行比较。

因为我在递减之后会立即再次递增(当外部循环继续时),它不会像你想知道的那样在检查中失败。如果[1]结果为[0]的副本,则i从1递减到0,然后立即递增回1。

作为旁注,由于你要产生双打,除非你产生大量的数据,否则你几乎不会得到重复。

答案 1 :(得分:0)

您应该使用Collection.contains方法(或为您的数组编写类似的内容),因为它们可以防止重复。 Set(例如SortedSet)确实针对某些用例进行了性能优化。

答案 2 :(得分:0)

使用Set而不是数组。

 Set<Double> set = new HashSet<>();
    for (int i = 0; i < size; i++) {
         set.add(Math.random() * 100)
    }
    System.out.println(set);

现在你只有唯一的价值