根据浮点值对对象数组进行排序

时间:2021-01-21 21:32:39

标签: java arrays sorting object

我开始学习 Java。目前我被困在按照对象中浮点值的升序对对象数组进行排序。目标是从数据数组中绘制图形。在绘制图形之前,我必须对坐标进行排序,以便 x 值按升序排列。因此,我将它们放在一个对象中以将 xy 数据链接在一起。

我从 2 个浮点数组开始:

float[] xValues = {-5.6f, 2.1f, 0.1f, 4.4f, 8.5f, -1.6f};
float[] yValues = {1.0f, 2.4f, 5.7f, -2.8f, -6.4f, 2.9f};

比我使用这个函数把它放到一个 Point 对象数组中:

graphPoints = new Point[arrayLength];
for (int i = 0; i < graphPoints.length; i++) {
    graphPoints[i] = new Point();
}

for (int i = 0; i < graphPoints.length; i++) {
    graphPoints[i].x = x[i];
    graphPoints[i].y = y[i];
}

包含此对象:

class Point {
    public float x;
    public float y;
}

我在网上找到的可能解决方案建议使用 comparator<Point> 对对象数组进行排序,这是我还没有学到的。使用我发现的示例无法使其与浮点值一起使用。所有示例都适用于 int 字符串。

我错过了什么吗?有没有合适的方法来做到这一点?谁能给我一些关于这个主题的指导?

2 个答案:

答案 0 :(得分:3)

比较器是正确的方法。您可以对 x 和 y 值的数组进行排序,以便对 Points 的结束数组进行排序,但我认为让您的点类实现 Comparable 接口更好,更不容易出错。

class Point implements Comparable<Point>{
    public float x;
    public float y;
    
    @Override
    public int compareTo(Point o) {
       if(this.x>o.x){
           return 1;
       }else if(this.x==o.x){
           return 0;
       }else{
           return -1;
       }
    }
}

然后你就可以打电话

Arrays.sort(graphPoints); 对其进行排序。

切换 1 和 -1 返回值将切换是按升序还是降序排序。

说明

当您调用 Arrays.sort 方法时,它会使用 compareTo 方法比较数组中的每个点。如果 compare to 返回 1,则 sort 方法知道该点被认为大于它所比较的​​另一个点。如果为 0,则它们相等。如果它是 -1,那么它更少。这是标准的方法,可以轻松地对数组进行排序,而无需自己编写排序代码,这可能会很混乱且效率低下。

此外,只需更改 compareTo 方法,即可轻松更改排序行为。您可以更改它是升序还是降序,以及您的排序依据。例如,如果您愿意,只需在一处更改 compareTo,就可以轻松更改它是按 x 值还是按 y 值排序。

答案 1 :(得分:0)

您可以使用 Arrays#sort(T[],Comparator) 方法如下:

Arrays.sort(graphPoints, Comparator.comparing(Point::getX));

在这种情况下,您必须将 getter 方法添加到 Point 类:

class Point {
    public float x;
    public float y;

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }
}

另见:How to sort by a field of class with its own comparator?

相关问题