Java排序抛出java.lang.IllegalArgumentException异常:比较方法违反了其通用契约。

3
以下内容:

以下这段代码:

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属性对值进行排序。

如果您有任何想法或提示,请不吝赐教!

谢谢, Thomas

1个回答

5

很可能你遇到了一个int溢出的问题。由于哈希码在大小上可以是任意大的,因此减法可能会因为某些值对而导致溢出,从而在减去两个负数时产生正数。

使用来自Integer的实现替换减法可修复此问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接