Guava排序器Ordering原理及代码是怎样的

一 创建排序器

排序器:可以用来为构建复杂的比较器,以完成集合排序的功能:
本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例。
Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),
并且提供了链式调用方法,来定制和增强现有的比较器

//创建排序器
  @Test
  public void createOreing(){
    //对可排序类型做自然排序,如数字按大小,日期按先后排序
    Ordering<Comparable> natural = Ordering.natural();
    //按对象的字符串形式做字典排序
    Ordering.usingToString();
    //把给定的Comparator转化为排序器或者继承Ordering实现自定义排序器
    Ordering<Integer> from = Ordering.from((Integer x, Integer y) -> Ints.compare(x, y));
    System.out.println(from.max(5, 6));
  }

二 扩展排序器,变换成其他功能排序器

//衍生其他排序器
  @Test
  public void anotherOreing(){
    Ordering<Comparable> natural = Ordering.natural();
    natural.max(1, 2); //2
    //获取语义相反的排序器
    natural.reverse().max(1, 2); //1
    List<Integer> list = Lists.newArrayList(5, 9, 3, 7, 4);
    Collections.sort(list,natural.nullsFirst()); //使用排序器对集合排序
    list.forEach(x-> System.out.print(x+", ")); //3, 4, 5, 7, 9
 
    // 不使用这两个排序器,排序元素不能为null,否则会报空指针
    natural.nullsFirst();//使用当前排序器,并把null值排到最前
    natural.nullsLast();//使用当前排序器,并把null值排到最后
 
    natural.compound(natural);//合成另一个比较器,以处理当前排序器中的相等情况,即添加第二个比较器
 
    //onResultOf:将function应用在各个元素上之后, 在使用原始ordering进行排序
    Collections.sort(list,natural.onResultOf(x->x*(-1)));//元素变为负数再排序
    list.forEach(x-> System.out.print(x+", ")); //9, 7, 5, 4, 3
  }

三 使用排序器

//使用排序器
  @Test
  public void operOrdering(){
    Ordering<Comparable> natural = Ordering.natural();
    List<Integer> list02 = Lists.newArrayList(6,4,9,3,1,5,3);
    /**
     * greatestOf: 获取可迭代对象中最大的k个元素,并按从大到小排序,返回一个集合
     * leastOfL获取最小的几个,并按从小到大排序
     */
    natural.greatestOf(list02,1).forEach(x-> System.out.println(x)); //9
    natural.leastOf(list02,1).forEach(x-> System.out.println(x)); //1
    //返回集合的一个排好序的副本
    natural.sortedCopy(list02);
    natural.immutableSortedCopy(list02); //返回不可变的排序副本
    /**
     * isOrdered: 判断是否已经按排序器有序,元素不能少于2,允许有相等元素
     * isStrictlyOrdered: 是否严格排序,不允许有相等元素
     */
    Collections.sort(list02,natural);
    natural.isOrdered(list02);//true
    natural.isStrictlyOrdered(list02); //false
    //其他直接比较元素
    natural.compare(1,2);natural.max(5,6);natural.min(list02);
  }
         关注小编持续更新中!!!!! 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值