比较器java.util.Comparator

使用场景

定制排序:java.util.Comparator

  • 这个定制排序最常用的地方就是Arrays.sort(T[] a, Comparator<? super T> c)或者Collections.sort(List<T> list, Comparator<? super T> c)这两个地方了
  • 重写Comparator接口中的compare(Object o1,Object o2)方法,比较o1和o2的大小,将数组或者集合中的元素按照指定的策略进行排序输出
  • 我们可以将Comparator接口的实现类传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。当然因为这个接口是被@FunctionalInterface修饰的,所以我们在传递这个类型的参数时可以使用lambda的方式进行传参

使用举例 例如:

static class MyComparator implements Comparator<Integer>{
   @Override
   public int compare(Integer o1, Integer o2) {
       return o1.intValue() - o2.intValue();
   }
}
public static void main(String[] args) {
   Integer[] nums = {1,5,3,6};
   // 使用实现类的方式传递比较器
   Arrays.sort(nums,new MyComparator());
   // 使用匿名内部类的方式传递比较器
   Arrays.sort(nums, new Comparator<Integer>() {
       @Override
       public int compare(Integer o1, Integer o2) {
           return o1.intValue() - o2.intValue();
       }
   });
   // 使用lambda的方式传递比较器
   Arrays.sort(nums, (o1, o2) -> {
       return o1.intValue() - o2.intValue();
   });
}

底层实现的一个原理就是通过不断的调用我们自定义的排序方法,然后完成数组或集合的一个排序


详细解释

详细解释一下Comparator接口中的compare(Object o1,Object o2)方法:

结论:

int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,说明“o1<o2”,不会改变o1,o2的顺序;返回“零”,意味着“o1等于o2”,也不会改变o1和o2的顺序;返回“正数”,说明“o1>o2”会按照逆序返回

原则:

如果返回的值是一个正数,那么会按照o2、o1的顺序输出;
如果返回的是一个负数,那么会按照o1、o2的顺序输出

分析:
  1. 如果我们返回o1-o2,那么他会按照升序排序,为什么这么说呢?
    我们来看o1-o2,如果结果为正数,那么说明o1大于o2,又因为输出的结果是正数会按照逆序的o2,o1输出,这不正是按照升序的方式进行排序的吗
    如果o1-o2的结果为负数,说明o1小于o2,又因为输出的结果是负数不会改变输出的顺序,所以也是升序输出
  2. 如果我们返回o2-o1,那么它会按照降序排序,为什么这么说呢?
    还是上面的结论,如果o2-o1的结果为正数,说明o2大于o1,又因为输出的结果大于0,所以输出的顺序就是o2,o1,而o2大于大于o1,这不正是降序输出吗
    如果o2-o1小于等于o,说明o2小于等于o1,那么按照结论不会改变返回的顺序,那不正好是o1,o2的这个降序顺序吗
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值