Android:比较方法违反了其总合同

时间:2015-08-31 09:51:03

标签: java android sorting comparator

我在我的应用程序的某些中文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调用

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

例外是谈论这样的事情:

比较器应该是正确的,如果A> B和B&gt; C,然后A> C必须是真的。

因此,它归结为它为什么会出现这样的问题。 我的猜测是,由于位置的性质,距离的计算是不稳定

我建议你预先计算距离,然后在结果上使用比较器。

修改

样品

def get_paginate_by(self, queryset):
    if self.request.mobile:
        return 5
    return 20