【发布时间】:2015-08-31 09:51:03
【问题描述】:
我的应用程序在一些中国 Android 手机上出现了很多崩溃,并出现以下错误:比较方法违反其一般合同!
我读到这与 Collections.sort 调用有关。
我不太确定是不是因为我的自定义比较器。
这里是错误发生的地方:
if (!airports.isEmpty()) {
Collections.sort(airports, new DistanceToAirportComparator(location));
return airports.get(0);
}
比较器看起来像这样:
public class DistanceToAirportComparator implements Comparator<Airport> {
private final Location location;
public DistanceToAirportComparator(Location location) {
this.location = location;
}
@Override
public int compare(Airport airport1, Airport airport2) {
Location loc1 = getLocation(airport1);
Location loc2 = getLocation(airport2);
return Double.compare(location.distanceTo(loc1), location.distanceTo(loc2));
}
private Location getLocation(Airport airport){
Location location = new Location(LocationManager.GPS_PROVIDER);
location.setLatitude(airport.getLocation().getLatitude());
location.setLongitude(airport.getLocation().getLongitude());
return location;
}
所以我不太确定 Comparator 是否搞砸了,或者我是否需要以不同的方式调用 collections.sort
感谢任何帮助
【问题讨论】:
-
您的排序调用是正确的。问题可能是您没有比较两个传递的对象,而是将两者与第三个对象进行比较。不过这只是猜测。
-
如果您检查 Javadoc 的
Comparator或Comparable,您将看到合同。单独测试您的比较器代码,看看是否有可能与它违约。 -
你指的是 loc1 & loc2 吗?当您说第三个对象时,您的意思是返回 Double.compare?
-
见@Derek Fung 的回答,他解释得更好。您的比较可能不稳定,因为它基于第三个组件,即比较器中保存的位置。
-
@F43nd1r 谢谢。只是不确定我需要在代码中更改什么来修复它。
标签: java android sorting comparator