我有一个类,它存储坐标的纬度和经度,以及它与中心的距离。在我的算法的某个点上,我有一个这些坐标的列表,我想根据它们与中心的距离对它们进行排序。因此,我实现了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));
}
我想知道是否有更优雅的方法来解决这类问题,或者我是否做错了什么
适当的解决方案就是使用
return Double.compare(distanceCenter, compared.getDistanceCenter);
...事实上,在比较法中使用减法是非常罕见的。相反,您应该使用适当的
compare
方法。(即使对于int
s,使用减法进行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 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通