Comparison method violates its general contract!

 报错代码

            item.setResults(resultMap.getOrDefault(id, Lists.newArrayList()).stream()
                    .sorted((r1, r2) -> r1.getResultMode().equals(WorkResultModeEnum.COMPARE) ? -1 : 1)
                    .sorted((r1, r2) -> code2Index.get(r1.getName()) == null ? 1
                            : (code2Index.get(r2.getName()) == null ? -1 : 

这是因为在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,否则 Arrays.sort,Collections.sort都会报 IllegalArgumentException 异常。

自反性:当两个相同的元素相比时,compare必须返回0,也就compare(o1, o1) = 0;
反对称性:如果compare(o1,o2) = 1,则compare(o2, o1)必须返回符号相反的值也就是 -1;
传递性:如果 a>b, b>c, 则 a必然大于c。也就是compare(a,b)>0,compare(b,c)>0, 则compare(a,c)>0。

简单来说,就是需要考虑对象o1和对象o2为null的情况,即当o1与o2都为null时两者大小如何判定呢,当o1为null但o2不为null时两者大小又如何判定呢,同理当o2为null但o1不为null时两者大小又如何判定呢。

修改后代码:

code2Index.get(r1.getName()).compareTo(code2Index.get(r2.getName())))).collect(Collectors.toList()));
            item.setResults(resultMap.getOrDefault(id, Lists.newArrayList()).stream()
                    .sorted((r1, r2) -> {
                        if (r1.getResultMode().equals(WorkResultModeEnum.COMPARE) && !r2.getResultMode().equals(WorkResultModeEnum.COMPARE)) {
                            return -1;
                        } else if (!r1.getResultMode().equals(WorkResultModeEnum.COMPARE) && r2.getResultMode().equals(WorkResultModeEnum.COMPARE)) {
                            return 1;
                        } else {
                            Integer r1Index = code2Index.get(r1.getName());
                            Integer r2Index = code2Index.get(r2.getName());
                            if (r1Index == null && r2Index == null) {
                                return 0;
                            } else if (r1Index == null) {
                                return 1;
                            } else if (r2Index == null) {
                                return -1;
                            } else {
                                return r1Index.compareTo(r2Index);
                            }
                        }
                    })
                    .collect(Collectors.toList()));

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值