在Java中实现compareTo()方法

时间:2017-08-21 11:21:07

标签: java android sorting comparable

我有一个Vehicle类,只要我有一个Vehicle对象列表就需要对它进行排序。我已经实现了Comparable接口并覆盖了compareTo()方法。

它可以工作,但偶尔应用程序崩溃(这是一个Android应用程序)。我得到的错误是java.lang.IllegalArgumentException: Comparison method violates its general contract!

这里是compareTo()方法的代码:

//this is used as a comparison criteria when using the Collections.sort() method on a Vehicle list
@Override
public int compareTo(@NonNull Object o) {
    Vehicle v = (Vehicle) o;
    try {
        if (this.getVehicleParameters().getMainSwitch().equals("on") && v.getVehicleParameters().getMainSwitch().equals("on")) {
            if (this.getVehicleId().compareTo(v.getVehicleId()) > 0) value = 1;
            else if (this.getVehicleId().compareTo(v.getVehicleId()) == 0) value = 0;
            else value = -1;
        } else if (this.getVehicleParameters().getMainSwitch().equals("on") && v.getVehicleParameters().getMainSwitch().equals("off")) {
            value = -1;
        } else if (this.getVehicleParameters().getMainSwitch().equals("off") && v.getVehicleParameters().getMainSwitch().equals("on")) {
            value = 1;
        } else if (this.getVehicleParameters().getMainSwitch().equals("off") && v.getVehicleParameters().getMainSwitch().equals("off")) {
            if (this.getVehicleId().compareTo(v.getVehicleId()) > 0) value = 1;
            else if (this.getVehicleId().compareTo(v.getVehicleId()) == 0) value = 0;
            else value = -1;
        }
    } catch (Exception e) {
        if (this.getVehicleParameters().getMainSwitch() == null) value = -1;
        else value = 1;
    }

    return value;
}

它做的是:首先按车辆的主开关(如果发动机打开或关闭)进行排序,然后按字母顺序对其进行排序。因此,您会获得一个列表,其中包含已启动引擎的车辆,按字母顺序排序,然后在此列表的末尾是关闭引擎的车辆,按字母顺序排序。

catch块中,我提出了一个简单的规则,即如果当前对象的主开关为空,则返回值-1。否则,返回1.

然而,应用程序偶尔崩溃,给我错误java.lang.IllegalArgumentException: Comparison method violates its general contract!

你能看到这里的错误吗?

PS。这不是另一个问题的重复,因为我们在这里处理可能的NULL值,并且当问题出现时 - 当它进入catch块时。至少,这是唯一合理的解释。错误随机出现,可能在2分钟后,也许在30分钟后(应用程序是实时的)。

0 个答案:

没有答案