数组未基于compareto方法覆盖进行排序

时间:2018-03-24 05:10:58

标签: java sorting

我想我可能会失去理智,因为我无法解释为什么我的Array没有根据x进行排序。是否有人可以快速浏览并让我知道我错过了什么?

我的目标是,如果我有一对(x,y)对,可以根据x从最大到最小对对象进行排序。根据我需要减去哪个对象,但实际比较可能是关闭的,但目前还没有进行排序。

据我所知,这是一个很好的问题,基于Google上出现的众多结果,但我觉得好像我已经按照这些答案而没有得到结果。

static class Point implements Comparable<Point> {
    long x, y;

    public Point(long x, long y) {
        this.x = x;
        this.y = y;
    }

    public int compareTo(Point o) {
        if((this.x - o.x) > 0) return 1;
        else if ((this.x - o.x) < 0) return -1;
        return 0;
    }

    public long getX() {
        return x;
    }
}

以下是我用来调用sort并打印数组的方法。它与Point在同一个父类中:

static double minimalDistance(int[] x, int y[]) {
    double ans = Double.POSITIVE_INFINITY;
    Point[] pairs = new Point[x.length];
    for(int i = 0; i < x.length; i++){
        pairs[i] = new Point(x[i], y[i]);
        System.out.println(x[i] + " " + y[i]);
    }
    Arrays.sort(pairs, Point::compareTo);
    System.out.println();
    for(int i = 0; i < x.length; i++){
        pairs[i] = new Point(x[i], y[i]);
        System.out.println(x[i] + " " + y[i]);
    }
    return ans;
}

1 个答案:

答案 0 :(得分:1)

您正在正确排序。但是你正在排序pairs数组。

在下面的一行中:

Arrays.sort(pairs, Point::compareTo);
System.out.println();
for(int i = 0; i < x.length; i++){
    pairs[i] = new Point(x[i], y[i]);     // <=== I mean this line
    System.out.println(x[i] + " " + y[i]);
}

您再次覆盖pairs。所以它看起来好像没有排序。

如果您要更新x[]y[]数组,请执行以下操作:

Arrays.sort(pairs, Point::compareTo); // Arrays.sort(pairs); would also work
System.out.println();
for(int i = 0; i < x.length; i++){
    x[i] = (int) pairs[i].x;                 // added this line
    y[i] = (int) pairs[i].y;                 // added this line
    System.out.println(x[i] + " " + y[i]);
}

工作演示:http://tpcg.io/tYD924