【问题标题】:Sorting an object array on a float value根据浮点值对对象数组进行排序
【发布时间】:2021-04-26 09:10:27
【问题描述】:

我开始学习 Java。目前,我陷入了按对象中浮点值的升序对对象数组进行排序的问题。目标是从数据数组中绘制图表。在我可以绘制图表之前,我必须对坐标进行排序,以便 x 值是升序的。所以我把它们放在一个 Object 中,将 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&lt;Point&gt; 对对象数组进行排序,这是我还没有学过的。使用我发现的示例无法使其与浮点值一起使用。所有示例都适用于 int 字符串。

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

【问题讨论】:

    标签: java arrays sorting object


    【解决方案1】:

    比较器是正确的方法。您可以对 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 值排序。

    【讨论】:

    • 这是一个很好的解决方案,但在最纯粹的意义上,Comparable 接口应该由其实例具有自然秩序感的类实现,即明确规定的契约实例的排序方式。这对于像BigInteger 这样的类来说非常直观,其值显然具有自然排序,但对于Point 实例来说不是那么清楚,因为可以通过多种方式对它们进行排序。一个可以说是更清晰的解决方案是使用单独的 Comparator 实例作为策略并使用该模式明确排序。
    【解决方案2】:

    您可以使用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?

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2017-09-29
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多