理解Comparator的返回值与sort排序的关系

       一直以来很难正确的理解Collections.sort()中自定义的比较函数Comparato的返回值与排序存在的关系;最近又梳理了一下才有了一些头绪。

 要想记住这个关系,需要认识两个部分:

 1.  public int compare(Integer t2, Integer t1) 中两个参数的含义:

 Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer t2, Integer t1) {
                /**
                 * 首先明确compare的两个参数的含义
                 *  t2: 指的是右边的参数
                 *  t1:指的是左边的参数
                 *
                 *  例如: 100  40  70  16  5  66
                 *        t2: 40 ----- t1: 100
                 *        t2: 70 ----- t1: 40
                 *        t2: 16 ----- t1: 70
                 *        t2: 5  ----- t1: 16
                 *        t2: 66 ----- t1: 5
                 */
                System.out.println("t2: " + t2 + "-----t1: " + t1);

                return 0;
            }
 });

2. 在Collections.sort()的源码中有这样的一段代码:

        /**
         * var3.compare(var0[var4++], var0[var1]) 这个就是调用我们自定义的Compare方法,
         */
        if (var3.compare(var0[var4++], var0[var1]) >= 0) {
            /**
             * 如果返回值 >=0 , 并不会做任何有关排序的处理
             */
            while(var4 < var2 && var3.compare(var0[var4], var0[var4 - 1]) >= 0) {
                ++var4;
            }
        } else {
            /**
             * 如果返回值 < 0 , 会执行——reverseRange(var0, var1, var4)交换顺序
             */
            while(var4 < var2 && var3.compare(var0[var4], var0[var4 - 1]) < 0) {
                ++var4;
            }
            reverseRange(var0, var1, var4);
        }

3. 结论

 当compare的返回值小于0时,会将  t2  和  t1 (compare()中的两个参数)交换顺序,大于等于0不会变换顺序;

 可根据具体的排序需求来决定是否让他们交换顺序

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Heynchy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值