关于Comparator接口的compare方法定义升序降序问题

关于Comparator接口的compare方法定义升序降序问题

compare(int o1, int o2)方法 return o1 - o2 是升序,return o2 - o1 是降序的原因是什么?

尝试过的解决方式:

sort中的源码没看太懂,麻烦讲解一下

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2022-04-22 16:25:37

    同学你好,在源码的sort方法中,最终会根据返回值的数值对结果顺序进行排列。这里会有多次方法调用,不建议同学在初学阶段尝试直接阅读源码。

    老师这里讲源码的核心原理为同学介绍一下:

    Comparator接口的compare方法,最终会通过接口回调的方式,被sort方法的底层所调用。而sort方法会根据compare方法返回的int值来决定是否将参数o1和o2的位置进行互换。

    所以在Comparator接口的注释中也尝试描述过规则,当返回值为正整数时,o1会排在o2的前面。当返回值为负整数时,o1和o2的位置会被互换,即o1会排在o2的后面。当返回值为0时,不会对这两个元素进行变更,因为两个元素实际上是相同排列优先级的,前后位置是没有区别的。

    那么,我们可以尝试带入数据:

        1.如果o1=1,o2=2,那么如果采用o1-o2的排列方式,int值为负数,此时需要将o1和o2的位置进行互换,即顺序为{2,1},也就是降序。

        2.如果o1=2,o2=1,那么如果采用o1-o2的排列方式,int值为正数,此时无需将o1和o2的位置进行互换,即顺序为{2,1},也就是降序。

        3.如果o1=1,o2=2,那么如果采用o2-o1的排列方式,int值为正数,此时无需将o1和o2的位置进行互换,即顺序为{1,2},也就是升序。

        4.如果o1=2,o2=1,那么如果采用o2-o1的排列方式,int值为负数,此时需要将o1和o2的位置进行互换,即顺序为{1,2},也就是升序。

        5.如果o1=1,o2=1,由于两者相同,无论采取哪种比较方式,int值都为0,也就不需要排序。 

    综上可知,在Java中,只是制定了对两个元素位置的放置规则,而我们根据这个规则发现了升序与降序的规律,这些规律是没有直接写在源码的注释中的。

    祝学习愉快~


  • 提问者 光脚的格格巫 #1

    o1-o2  (方法调用对象-参数)是升序吧?


    https://img1.sycdn.imooc.com//climg/62626bd909e9949d07190439.jpg

    2022-04-22 16:49:09
  • 提问者 光脚的格格巫 #2

    还有就是要比较的自定义类中如果有多个对象,比较的顺序是什么?

    2022-04-22 16:50:46
  • 同学你好,对于这个方法而言,只关注最终的返回值。

    所以无论对比的对象有多少属性,属性是什么类型的,只要根据业务需要制定规则即可。

    例如Student对象有name和age,现在需要“根据年龄升序,如果年龄相同则根据姓名降序”的话,实现的核心代码如下:

    if(o1.age != o2.age){
        return o2.age - o1.age;
    }else{
        return o1.name.compare(o2.name);
    }

    以上只是两个属性,如果有多个属性也可以参照这样的实现方式。

    祝学习愉快~


    2022-04-22 17:29:02
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师