0

可能重复:此自定义比较方法是否包含逻辑错误
我尝试使用默认位置对位置列表进行排序。哪个位置接近默认位置大于其他位置。这是我的尝试:

public int compare(Location lhs, Location rhs) {
    if(lhs == null && rhs == null){
        Ln.d("l1, l2 are null");
        return 0;
    }

    if(lhs == null && rhs != null){
        Ln.d("l1 is null");
        return -1;
    }

    if(lhs != null && rhs == null){
        Ln.d("l2 is null");
        return 1;
    }

    float[] result1 =  new float[1];
    float[] result2 = new float[1];
    double startLat;
    double startLng;
    double endLat;
    double endLng;
    double defaultLat = getDefaultLocation().getLatitude();
    double defaultLng = getDefaultLocation().getLongitude();

  // because sometime location is null:
    try{
        startLat = Double.parseDouble(lhs.getLat());
        startLng = Double.parseDouble(lhs.getLng());
    }catch(Exception ex){
        return 1;
    }

    try{
        endLat = Double.parseDouble(rhs.getLat());
        endLng = Double.parseDouble(rhs.getLng());
    }catch(Exception ex){
        return -1;
    }

    android.location.Location.distanceBetween(startLat, startLng, defaultLat, defaultLng, result1);         
    android.location.Location.distanceBetween(endLat, endLng, defaultLat, defaultLng, result2);

    int result = Double.compare(result1[0], result2[0]);
    Ln.d("result 1 = " + result1[0] + ", result 2 = " + result2[0] + "  and result = " + result);
    return result;  

}

问题是它给了我java.lang.IllegalArgumentException这样的:

 java.lang.IllegalArgumentException: Comparison method violates its general contract!

我还在stackoverflow上搜索了很多答案,但它们都不适合我。我知道方法不是传递的,但我不知道如何解决它。任何帮助,将不胜感激。

更新:这是我的位置实体:

public class Location{
    private long id;        
    private String provider_name;
    private String display_address; 
    private String lat; 
    private String lng;
    private int zoom;   
    private String contact; 
    private String website; 
    private String email;
        // getters & setter
 }

更新 2:最后它起作用了,因为这是我的错误。当左侧位置 lat 或 long 为 null 时,应返回 1 而不是 -1。这是正确的代码:

 try{
        startLat = Double.parseDouble(lhs.getLat());
        startLng = Double.parseDouble(lhs.getLng());
    }catch(Exception ex){
        return 1;
    }

    try{
        endLat = Double.parseDouble(rhs.getLat());
        endLng = Double.parseDouble(rhs.getLng());
    }catch(Exception ex){
        return -1;
    }

非常感谢rolfl和其他人。

4

2 回答 2

1

您也可以采用这种方法:

 Collections.sort(yourLocations, new Comparator<Location>() {
                    @Override
                    public int compare(Location o, Location o2) {
                        final Float distance1 = currentLocation.distanceTo(o);
                        final Float distance2 = currentLocation.distanceTo(o2);
                        return distance1.compareTo(distance2);
                    }
                });
于 2013-11-04T14:53:35.533 回答
0

当您有两个对象时,您会收到此异常,a并且b您还可以从比较器中获得以下结果:

compare(a, b) != 0;
compare(a, b) == compare(b, a);

在这种情况下,有几个条件满足上述条件:

a.getLat() == null && b.getLat() == null

例如,在这种情况下,compare(a,b) 将返回 1(来自异常),compare(b,a) 也将返回 1。

因此你的问题。

于 2013-11-04T14:59:06.930 回答