当前位置: 首页 > 知识库问答 >
问题:

Java-数量非常少的可比较接口

麹耘豪
2023-03-14

我有一个类,它存储坐标的纬度和经度,以及它与中心的距离。在我的算法的某个点上,我有一个这些坐标的列表,我想根据它们与中心的距离对它们进行排序。因此,我实现了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));
}

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

共有1个答案

宋涵衍
2023-03-14

适当的解决方案就是使用

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

...事实上,在比较法中使用减法是非常罕见的。相反,您应该使用适当的compare方法。(即使对于ints,使用减法进行compareTo实现也可能会很失败。)

 类似资料:
  • 我的任务是用java编写mergesort,任务还规定我不能使用整数,我必须使用可比较的整数。这是我第一次使用java。我的问题是在合并函数内比较两个comp int数组中的元素。我尝试了if(list[I])compareTo(list2[j]),但compareTo只能取整数。任何帮助都将不胜感激

  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜

  • 当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。

  • 编辑问题以包括所需的行为、特定问题或错误,以及再现问题所需的最短代码。这将帮助其他人回答这个问题。 我的任务是用java编写mergesort,任务还规定我不能使用整数,我必须使用可比较的整数。这是我第一次使用java。我的问题是在合并函数内比较两个comp int数组中的元素。我尝试了if(list[I])compareTo(list2[j]),但compareTo只能取整数。任何帮助都将不胜感

  • 我想创建一个类,比如Employee,它实现了通用接口Compariable,并重写了方法equals、hashCode和toString。。。我怎样才能做到呢? 这样可以吗 和

  • 问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通