Y_csgoto
Y_csgoto
采纳率100%
2019-11-15 18:58

请问JAVA的sort方法中这个comparator参数是干什么,又是如何实现它所期望的功能的呢?

已采纳

最近在学习JAVASE,教程中有提到arrays.sort()方法,可以传入两个参数,以实现对对象进行比较的功能,课堂笔记如下

Arrays.sort(test01, new Comparator<commodity>(){
        //在匿名内部类中重写Comparator匿名内部类的抽象方法
        @Override
        public int compare(commodity o1, commodity o2) {
        return o1.commodityCost - o2.commodityCost;
        }
    });
    System.out.println(Arrays.toString(test01));
    }

可以看到,这里只是重写了一下compare方法,返回一个两数相减,就说已经实现了比较功能,这是为什么呢,传进去一个接口是想干什么,又最后干了什么呢?

它的实现机理我应该去哪里找呢?

求大佬解答

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • m0_37602827 little_fat_sheep 2年前

    Comparator 是一个**比较器**接口,Arrays.sort() 是排序函数,默认是升序排序,有时候需要降序排序,就需要传递一个Comparator,并重写其compare( ) 方法;
    另一方面,如果需要排序的数组是引用类型,比如student对象,假设有score和id两个属性,那到底是按照什么属性排序呢?此时,如果你想按照score排序,就可以传递一个Comparator,并在其compare( ) 方法中对score进行比较。
    大概就是这个意思吧,具体代码实现,推荐以下博客:
    https://blog.csdn.net/m0_37602827/article/details/99479065 (3.1节)

    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 2年前
    rrays.sort()是排序算法,为了让排序通用,那么就必须让调用者来规定按照什么条件排序。
    comparator的作用就是调用者告诉排序算法。排序的规则。
    排序的规则其实就是给出任意两个元素,定义谁大谁小的规则。
    compare约定,对于传入两个参数o1 o2,如果返回的整数>0,说明第一个大,<0说明第2个大,=0说明一样大。
            public int compare(commodity o1, commodity o2) {
            return o1.commodityCost - o2.commodityCost;
            }
    因此可见,这么写就是让数组按照commodityCost 来排序。
    如果写
            return o2.commodityCost - o1.commodityCost;
    那么显然原来>0的,现在<0了,也就是原来大的,现在变成小了。因此这么写,可以倒排序。
    另外,特别要注意的是,作为比较的两个对象,这个规则必须是偏序的。
    什么叫偏序?就是如果a>b,b>c,那么不允许出现a<=c的情况
    现实中,很多事物不是偏序的,不能排序。
    比如石头、剪子、布,石头>剪子,剪子>布,布>石头,这个就不行。
    比较几个城市的东西的关系,伦敦在纽约东边,纽约在洛杉矶东边,洛杉矶在东京东边,东京在莫斯科东边,莫斯科在伦敦东边,这个也不行。
            public int compare(commodity o1, commodity o2) {
            return 100;
            }
    这么写,也就是永远o1>o2,这就是非法的。
    
    点赞 3 评论 复制链接分享
  • lee_jackgg 我的大神666 2年前
            Integer[] in = {2, 5, 1, 6, 3}; 
            /* 
            Comparator比较:负数  <<  0 >> 正数
            对于Comparator比较两个值的返回值:
            负数:左值往前
            0 值:无需移动
            正数:左值往后
            2 5 -> 2 5 
            5 1 -> 1 5 
            2 1 -> 1 2 
            2 5 1 -> 1 2 5
            */
    
            Arrays.sort(in); // 使用默认排序(左值和右值比)
            System.out.println(Arrays.toString(in));
            // 输出:[1, 2, 3, 5, 6]
            Arrays.sort(in, new Comparator<Integer>(){
                @Override //重写排序(左值和右值比反着来移动)
                public int compare(Integer o1, Integer o2) {
                    return o2-o1; //-(o1-o2) 这样看起来就容易理解,负号代表反着移动。
                }           
            });
            System.out.println(Arrays.toString(in)); 
            // 输出:[6, 5, 3, 2, 1]
    
    点赞 1 评论 复制链接分享