zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    thusc总结
    5.12总结
    5.9总结
    C语言学习之笔记
    C语言----------指针
    typedef , static和 extern
    数据库(mysql5.5)的一些基本的操作
    Java中基本数据类型占几个字节多少位
    java &和&& 以及 |和 ||之间的异同点
    拨开云雾见月明
  • 原文地址:https://www.cnblogs.com/houzheng/p/10903403.html
Copyright © 2011-2022 走看看