JDK 8 Integer obj.compareTo throws比较方法违反了它的一般合约Exception

时间:2017-03-01 10:30:27

标签: java sorting compare

我已经用Google搜索并彻底检查了所有问题和答案。比较方法违反了其总合同"错误。我无法弄清楚情况出了什么问题。我编写了一个比较器类,有时会在CI中抛出此异常。我只在我的NumberStringComparator中使用Integer obj.compareTo方法,这个类在Arrays.sort方法中使用。

Arrays.sort(valuesArray, new NumberStringComparator()); 

班级代码

private static class NumberStringComparator implements Comparator<Object>
{
    @Override
    public int compare (Object entry1, Object entry2) {

        if(!(entry1 instanceof String && entry2 instanceof String)){
            throw new ClassCastException();
        }

        try{
            Integer a1 = Integer.valueOf((String)entry1);
            Integer a2 = Integer.valueOf((String)entry2);
            return a1.compareTo(a2);
        }
        catch(Exception e){
            try{
                return ((String)entry1).compareTo((String)entry2);
            }
            catch(Exception e1){
                throw new ClassCastException();
            }
        }
    }
}

编辑: 使用的样本值(超过千个值)是:

1234567894,1234567893,1234567892,1234567891,1234567890,12345678949,491940032,491940033,12345678947,491940030,12345678948

1 个答案:

答案 0 :(得分:2)

此解决方案的问题在于您的比较器不具有传递性。

很有可能你的数组中有三个元素A,B和C它们没有传递关系。

换句话说,当比较器不是传递时,你可以得到A> B和B&gt; C也是C> A.