Java sort抛出java.lang.IllegalArgumentException:比较方法违反了其一般合同

时间:2013-12-21 13:50:10

标签: java exception

以下几行:

ArrayList<ShowdownSingleValueVO> sortedValues = new ArrayList<>();
(...fill the array...)
Collections.sort(sortedValues);

返回以下异常:比较方法违反了其一般合同!

我知道这种异常通常在比较方法未正确实现时生成,但在我的情况下,它的实现非常明显:

public static class ShowdownSingleValueVO implements Comparable<ShowdownSingleValueVO>{
    int hashValue;
    byte showdownValue;
    public ShowdownSingleValueVO(int hashValue, byte showdownValue) {
        this.hashValue = hashValue;
        this.showdownValue = showdownValue;
    }
    @Override
    public int compareTo(ShowdownSingleValueVO o) {
        return this.hashValue - o.hashValue;
    }
}

如您所见,目标是使用hashValue属性对值进行排序。

我非常感谢您对我做错的任何想法/暗示!

谢谢, 托马斯

1 个答案:

答案 0 :(得分:5)

您很可能遇到int溢出。由于哈希码的幅度可以任意大,因此可以想象减法会在某些值对上溢,在减去两个负数时产生正值。

implementation from Integer替换减法以解决此问题:

public int compareTo(ShowdownSingleValueVO o) {
    return Integer.compare(this.hashValue, o.hashValue);
}