java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeLo(TimSort.java:777)
    at java.util.TimSort.mergeAt(TimSort.java:514)
    at java.util.TimSort.mergeCollapse(TimSort.java:439)
    at java.util.TimSort.sort(TimSort.java:245)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1462)

排个序,还出bug啦,查啦下,还比较高级,

说是我们要排序的对象要建议实现满足对称性,传递性和自反性。说实话,这是啥啊,不造啊。我关心怎么解决问题。

我原来的排序是这么写的

    /** 
     *  异步交易按创建时间降序排 
     */ 
    Ordering<AdaptiveTrace> ADAPTIVE_TRACE_DESC_ORDERING = new Ordering<AdaptiveTrace>() { 
        @Override 
        public int compare(AdaptiveTrace left, AdaptiveTrace right) { 
            if (left == null || left.getCreateAt() == null) { 
                return 1; 
            } 
            if (right == null || right.getCreateAt() == null) { 
                return -1; 
            } 
            return right.getCreateAt().compareTo(left.getCreateAt()); 
        } 
    };

然后,这个代码就报错啦。说是因为,我这数据会出现同时为null空的情况。

然后,看怎么解决这个问题。

    /** 
     *  别名方案按创建时间降序排 
     */ 
    Ordering<AliasScheme> ALIAS_SCHEME_DESC_ORDERING = new Ordering<AliasScheme>() { 
        @Override 
        public int compare(AliasScheme left, AliasScheme right) { 
            if (left == null && right == null) { 
                return 0; 
            } 
            if (left == null) { 
                return 1; 
            } 
            if (right == null) { 
                return -1; 
            } 
            if (left.getCreateAt() == null && right.getCreateAt() == null) { 
                return 0; 
            } 
            if (left.getCreateAt() == null) { 
                return 1; 
            } 
            if (right.getCreateAt() == null) { 
                return -1; 
            } 
            return right.getCreateAt().compareTo(left.getCreateAt()); 
        } 
    };

看,这次的判断就比较完善啦。

然后,排序就OK啦。

然后,调用排序接口的地方的代码如下:

 
        List<AliasScheme> aliasSchemes = Lists.newArrayList(aliasSchemeRepository.findAll()); 
        aliasSchemes.sort(OrderingConstants.ALIAS_SCHEME_DESC_ORDERING);

然后就完事儿了。


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java NumberFormat 之 格式化float类型的时候的bug知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。