java.lang.IllegalArgumentException: Comparison method violates its general contract!

本文详细解析了在使用Collections.sort()方法时遇到的IllegalArgumentException异常,该异常源于比较器违反其通用契约。通过调整比较器逻辑,确保了当元素首拼音为特定字符时的正确排序,避免了排序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是错误日志

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeCollapse(TimSort.java:439)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1498)
at java.util.ArrayList.sort(ArrayList.java:1470)
at java.util.Collections.sort(Collections.java:201)

出现问题的原因是使用 Collections.sort()排序的结果处理没有考虑全面,要对所有结果都做处理,官方解释说的是不严谨!
下面是正确代码
下面是解决好的代码!

   // 排序
                                    Collections.sort(searchInfoBean.getCustomerList(), new Comparator<FinanceSearchInfoBean.CustomerInfo>() {
                                        @Override
                                        public int compare(FinanceSearchInfoBean.CustomerInfo o1, FinanceSearchInfoBean.CustomerInfo o2) {
                                            if (o1.getCustomerNameFirstPinYin().equals("#")) {
                                                if (o2.getCustomerNameFirstPinYin().equals("#")) {
                                                    //两个都是# 对比大小
                                                    return o1.getCustomerNamePinYin().compareTo(o2.getCustomerNamePinYin());
                                                } else {
                                                    //第一个# 第二个不是# 返回-1 不换位置
                                                    return -1;
                                                }
                                            } else {
                                                if (o2.getCustomerNameFirstPinYin().equals("#")) {
                                                    //第一个不是# 第二个是# 直接换位置 返回1
                                                    return 1;
                                                } else {
                                                    //两个都不是# 进行对比
                                                    return o1.getCustomerNamePinYin().compareTo(o2.getCustomerNamePinYin());
                                                }
                                            }
                                        }
                                    });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值