【发布时间】: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