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

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

方绪
2023-03-14

我看到我的应用程序在一些中国 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;
}

所以我不太确定比较器是否搞砸了什么,或者我是否需要以不同的方式进行collections.sort调用

感谢任何帮助

共有1个答案

仰翔
2023-03-14

例外是谈论这样的事情:

比较器应该是正确的,因为如果A

所以,这归结为什么会有这样的问题。我的猜测是,由于位置的性质,距离的计算是不稳定的

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

编辑:

样品

private Airport sortByDistance(Location location) {
    List<Airport> airports;
    if (!airports.isEmpty()) {
        ArrayList<AirportWithDistance> distanceArrayList = new ArrayList<AirportWithDistance>(airports.size());
        for (Airport airport : airports) {
            distanceArrayList.add(new AirportWithDistance(airport, getDistance(airport, location)));
        }
        // replace start
        Collections.sort(distanceArrayList, new DistanceToAirportComparator());
        return airports.get(0).airport;
        // replace end
        //also seems u should replace the above to the line below instead, as you only wan min
        //return Collections.min(distanceArrayList, new DistanceToAirportComparator()).airport;
    }
    return null;
}


private static double getDistance(Airport airport, Location location){
    Location airportLocation = new Location(LocationManager.GPS_PROVIDER);
    airportLocation.setLatitude(airport.getLocation().getLatitude());
    airportLocation.setLongitude(airport.getLocation().getLongitude());
    return location.distanceTo(airportLocation);
}

public static class AirportWithDistance {
    Airport airport;
    double distance;

    AirportWithDistance(Airport airport, double distance) {
        this.airport = airport;
        this.distance = distance;
    }

}

public static class DistanceToAirportComparator implements Comparator<AirportWithDistance> {

    public DistanceToAirportComparator() {
    }

    @Override
    public int compare(AirportWithDistance airport1, AirportWithDistance airport2) {
        return Double.compare(airport1.distance, airport2.distance);
    }

}
 类似资料:
  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。

  • 我在尝试对节点的数组列表进行排序时遇到了这个错误。我尝试了大多数解决方案,但没有一个在我的案例中有效。 此代码为 它适用于小输入,但是当输入数量很大时,它会给出这个错误。我也读过比较方法中的传递性规则,但我不知道它是如何在这种情况下应用的。 先谢谢你。

  • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误:

  • 问题内容: 我收到以下错误:“比较方法违反了它的一般约定!” 当使用以下比较器时,但是我无法使用jUnit复制异常。我想知道是什么引起了这个问题以及如何复制它。有一些其他例子也有相同的问题,但没有类似的例子。 通过使用以下代码调用该代码: `` Collections.sort(dtos, new DtoComparator()); ``` 谢谢你的帮助。 额外信息:该错误似乎发生在Java ut

  • 下面的代码在Java 6上运行时抛出“Java比较方法违反了它的通用契约”。但是,在Java 7上,它不会抛出同样的异常。有什么问题?。如何修改这段代码以在Java 7上抛出异常?。

  • 我想通过dateLastContact比较两个“收件人”,如果相同,就通过地址进行比较。这是我的代码: 而且我总是有这个错误: 我尝试了很多方法,但是现在,我不知道该怎么办。你能帮我吗? 收件人类别: