为了账号安全,请及时绑定邮箱和手机立即绑定

集合排序引发异常

集合排序引发异常

大话西游666 2022-06-15 17:14:36
我正在尝试对我的用户分数进行排序。它在本地运行良好,但是当我查看服务器日志时,它会引发很多异常。所以我尝试空检查并捕获异常,但异常仍然抛出异常。我不确定有什么例外。Collections.sort(userScores, new Comparator<UserScore>() {            @Override            public int compare(UserScore o1, UserScore o2) {                try {                    if(o1 == null || o1.getScore() == null) {                        return 1;                    }                    if(o2 == null || o2.getScore() == null) {                        return -1;                    }                    if(o1.getScore().doubleValue() > o2.getScore().doubleValue())                        return -1;                    return 1;                   }catch(Exception ex) {                    logger.severe(ex.getMessage());                    return 0;                }            }        });我的代码抛出,java.lang.IllegalArgumentException: Comparison method violates its general contract!        at java.util.TimSort.mergeLo(TimSort.java:777) ~[na:1.8.0_181]        at java.util.TimSort.mergeAt(TimSort.java:514) ~[na:1.8.0_181]        at java.util.TimSort.mergeCollapse(TimSort.java:441) ~[na:1.8.0_181]        at java.util.TimSort.sort(TimSort.java:245) ~[na:1.8.0_181]        at java.util.Arrays.sort(Arrays.java:1438) ~[na:1.8.0_181]        at java.util.List.sort(List.java:478) ~[na:1.8.0_181]        at java.util.Collections.sort(Collections.java:175) ~[na:1.8.0_181]        at com.tll.treeofwords.game.service.GameService.generateRanking(GameService.java:179) ~[classes!/:0.0.1-SNAPSHOT]        at com.tll.treeofwords.game.service.GameService.getCurrentGame(GameService.java:76) ~[classes!/:0.0.1-SNAPSHOT]        at com.tll.treeofwords.game.service.GameService.getCurrentGame(GameService.java:59) ~[classes!/:0.0.1-SNAPSHOT]        at com.tll.treeofwords.game.service.GameService$$FastClassBySpringCGLIB$$d5f3b9ef.invoke(<generated>) ~[classes!/:0.0.1-SNAPSHOT]        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.13.RELEASE.jar!/:4.3.13.RELEASE]
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您的 Comparator 没有正确处理将两个空值视为相等的情况。如果您比较两个对象o1o2,它们都是null,您的代码将导致:

compare(o1,o2) == 1

还有:_

compare(o2,o1) == 1

那应该是不可能的,因为o1不能同时大于小于o2. 因此,您看到的错误。

0如果o1o2(或它们各自的getScore()方法)都为空,则需要修改代码以返回。


查看完整回答
反对 回复 2022-06-15
?
浮云间

TA贡献1829条经验 获得超4个赞

无论传递给覆盖compare方法的参数顺序如何,它都会给出相同的结果。假设我们有o1.getScore().doubleValue() == o2.getScore().doubleValue(). 然后compare(o1, o2) == 1 && compare(o2, o1) == 1。的约定compare是对于每对参数o1o2,以下必须为真:compare(o1, o2) + compare(o2, o1) == 0



查看完整回答
反对 回复 2022-06-15
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信