Comparison method violates its general contract 问题的处理

版权声明:觉得此文有用的,不嫌麻烦的,就留个言呐,或者点个赞呐(额,就是文章底部的“顶”啦),要是嫌弃麻烦呢,也麻烦点个赞嘛,要是实在不想点赞呢,也不是不可以。 但是,你要是想踩一脚呢,那还是赶紧,马上,快快的闪人。 小心我手里三十米长的大刀。 哼哼。想想都怕 !!! https://blog.csdn.net/qq_27093465/article/details/82190723

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);

然后就完事儿了。

猜你喜欢

转载自blog.csdn.net/qq_27093465/article/details/82190723