Comparison method violates its general contract 问题的处理

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 ADAPTIVE_TRACE_DESC_ORDERING = new Ordering() {
        @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 ALIAS_SCHEME_DESC_ORDERING = new Ordering() {
        @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 aliasSchemes = Lists.newArrayList(aliasSchemeRepository.findAll());
        aliasSchemes.sort(OrderingConstants.ALIAS_SCHEME_DESC_ORDERING);

然后就完事儿了。

你可能感兴趣的:(java)