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

Tom*_*Tom 3 java exception

以下行:

ArrayList<ShowdownSingleValueVO> sortedValues = new ArrayList<>();
(...fill the array...)
Collections.sort(sortedValues);
Run Code Online (Sandbox Code Playgroud)

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,目标是使值按其hashValue属性排序.

任何关于我做错的想法/暗示都将不胜感激!

谢谢,托马斯

das*_*ght 5

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

实现Integer替换减法以解决此问题:

public int compareTo(ShowdownSingleValueVO o) {
    return Integer.compare(this.hashValue, o.hashValue);
}
Run Code Online (Sandbox Code Playgroud)