【问题标题】:Java - Comparable interface with very small numberJava - 数量非常少的可比接口
【发布时间】:2021-11-11 18:04:46
【问题描述】:

我有这个类来存储坐标的纬度和经度以及它与中心的距离。 在我算法的某个时刻,我有一个这些坐标的列表,我想按它们与中心的距离对它们进行排序。因此,我实现了 Comparable 接口及其 compareTo 方法。

public class Coordinate implements Comparable<Coordinate> {
    
    private Double lat;
    private Double lon;
    private Double distanceCenter;
    
    protected Coordinate(Double lon, Double lat, Double distanceFromCenter) {
        this.lat=lat;
        this.lon=lon;
        this.distanceCenter=distanceFromCenter;
    }
    
    public Double getDistanceFromCenter() {
        return distanceFromCenter;
    }
    
    @Override
    public int compareTo(Coordinate compared) {
        return (int) ((this.distanceCenter) - (compared.getDistanceCenter()));
    }
}

问题是有时候两个点的差值太小(几乎为零),java会抛出一个

java.lang.IllegalArgumentException: Comparison method violates its general contract

我解决了这个问题,只是将每个距离乘以一个非常高的数字,以避免任何“重要性损失”效应

@Override
public int compareTo(Eq compared) {
    return (int) ((this.distanceCenter*1000000000000000.0) (compared.getDistanceCenter()*1000000000000000.0));
}

我想知道是否有更优雅的方法来解决此类问题,或者我做错了什么

【问题讨论】:

    标签: java double comparable compareto loss-of-significance


    【解决方案1】:

    适当的解决方案就是使用

    return Double.compare(distanceCenter, compared.getDistanceCenter);
    

    ...事实上,您很少在compareTo 方法中使用减法。相反,您应该使用适当的compare 方法。 (即使对于ints,对compareTo 实现使用减法也可能会被破坏。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2013-08-16
      • 2013-05-28
      相关资源
      最近更新 更多