Guava Ordering

69 篇文章 1 订阅
8 篇文章 0 订阅

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

Ordering比较器构造方法:

S.N.方法及说明
1static Ordering<Object> allEqual()
返回一个所有对象都相等的排序器,这个排序器不会对元素顺序产生影响
2static Ordering<Object> arbitrary()
返回一个任意顺序的排序器,元素的顺序不定
3static <T> Ordering<T> compound(Iterable<? extends Comparator<? super T>> comparators)
复合多个排序器,排序规则按照排序器顺序决定,第一排序规则相等,则使用第二排序规则,以此类推
4static <T> Ordering<T> from(Comparator<T> comparator)
由comparator构造Ordering排序器
5static <C extends Comparable> Ordering<C> natural()
返回自然顺序排序器,即从小到大排序
6static Ordering<Object> usingToString()
按对象的字符串形式做字典排序

常用方法说明:

S.N.方法及说明
1<U extends T> Ordering<U> compound(Comparator<? super U> secondaryComparator)
合并排序器
2<E extends T> List<E> greatestOf(Iterable<E> iterable, int k)
<E extends T> List<E> greatestOf(Iterator<E> iterator, int k)
返回TOP K
3<E extends T> List<E> leastOf(Iterable<E> iterable, int k)
<E extends T> List<E> leastOf(Iterator<E> elements, int k)
返回最小的TOP K
4boolean isOrdered(Iterable<? extends T> iterable)
判断列表是否有序
5<E extends T> E max(E a, E b)
<E extends T> E max(E a, E b, E c, E… rest)
<E extends T> E max(Iterable<E> iterable)
<E extends T> E max(Iterator<E> iterator)
返回最大值
6<E extends T> E min(E a, E b)
<E extends T> E min(E a, E b, E c, E… rest)
<E extends T> E min(Iterable<E> iterable)
<E extends T> E min(Iterator<E> iterator)
返回最小值
7<S extends T> Ordering<S> nullsFirst()
使用当前排序器,但额外把null值排到最前面
8<S extends T> Ordering<S> nullsLast()
使用当前排序器,但额外把null值排到最后面
9<F> Ordering<F> onResultOf(Function<F,? extends T> function)
对集合中元素调用Function,再按返回值用当前排序器排序
10<S extends T> Ordering<S> reverse()
返回相反顺序
11<E extends T> List<E> sortedCopy(Iterable<E> elements)
返回一个排序后的列表,并且不改变排序列表顺序

示例代码:

Person实体类:

class Person {
    String name;
    Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    Person(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Person() {
        super();
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

按照name自然排序构建Ordering排序器:

/*根据name自然排序构建Ordering*/
Ordering<Person> nameOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<Person, String>(){
    public String apply(Person person) {
        return person.name;
    }
});

使用sortedCopy对列表进行排序,并且生成新的已排序的列表(不影响原列表的顺序):

List<Person> nameOrderedList = nameOrdering.sortedCopy(personList);

使用greatestOf、leastOf获取Top K:

/*greatestOf抽取Top K*/
System.out.println("Top K by Name:" + nameOrdering.greatestOf(personList, 2));
/*leastOf抽取最小的Top K*/
System.out.println("least Top K by Name:" + nameOrdering.leastOf(personList, 2));
/*也可以使用迭代器抽取Top K*/
System.out.println("Top K by Name:" + nameOrdering.greatestOf(personList.iterator(), 2));
System.out.println("least Top K by Name:" + nameOrdering.leastOf(personList.iterator(), 2));

按照age自然顺序排序构建Ordering排序器:

/*根据age自然排序构建Ordering*/
Ordering<Person> ageOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<Person, Integer>(){
    public Integer apply(Person person) {
        return person.age;
    }
});
personList.sort(ageOrdering);

使用reverse()获取逆序列表:

/*使用reverse()获取逆序ordering*/
personList.sort(ageOrdering.reverse());
System.out.println("age Reverse Order:" + personList);

compound构造复合排序ordering,先按照name排序,name相同则按照age排序:

Ordering<Person> compoundOrdering = nameOrdering.compound(ageOrdering);
personList.add(new Person("Michael", 25));
personList.sort(compoundOrdering);
System.out.println("compoundOrdering:" + personList);

对列表进行排序,可以使用Collections.sort(list, comparator)或者list.sort(comparator),排序后都会对原序列的顺序产生影响,Java8之后建议使用list.sort。但是有时候存在这样的场景,希望得到一个有序序列,但是不希望原序列的顺序发生改变,这时候可以使用Guava提供的Ordering排序器,通过sortedCopy方法返回一个有序序列。

测试代码:码云 – 卓立 – Guava测试

  1. Google Guava Docs
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Guava Ordering是一个用于排序的工具类,它为构建复杂的比较器提供了一种流畅的风格。通过使用Guava Ordering,我们可以根据自定义的规则对集合中的元素进行排序。 在Guava Ordering中,有三种静态方法用于创建Ordering排序器:natural()、usingToString()和from(Comparator)。natural()方法使用自然排序规则生成排序器,即从小到大的顺序。usingToString()方法根据元素的toString()方法返回值进行排序。from(Comparator)方法根据给定的Comparator生成排序器。 创建Ordering排序器后,可以使用它对集合或元素进行操作。常见的方法包括sortedCopy(List)、immutableSortedCopy(Iterable)、min(E, E)和max(E, E)等。sortedCopy(List)方法返回一个已排序的List副本,immutableSortedCopy(Iterable)方法返回一个不可变的已排序集合,min(E, E)方法返回两个元素中较小的那个,max(E, E)方法返回两个元素中较大的那个。 下面是一个示例代码,展示了如何使用Guava Ordering对People类的age属性进行排序: List<People> peopleList = new ArrayList<People>() { { add(new People("A", 33)); add(new People("B", 11)); add(new People("C", 18)); } }; Ordering<People> ordering = Ordering.natural().onResultOf(new Function<People, Comparable>() { @Override public Comparable apply(People people) { return people.getAge(); } }); for (People p : ordering.sortedCopy(peopleList)) { System.out.println(MoreObjects.toStringHelper(p) .add("name", p.getName()) .add("age", p.getAge())); } 这段代码中,我们首先创建了一个包含People对象的List。然后使用Ordering.natural().onResultOf()方法创建了一个排序器,该排序器按照People对象的age属性进行排序。最后,我们通过ordering.sortedCopy()方法将集合按照排序规则进行排序,并打印排序后的结果。 通过使用Guava Ordering,我们可以轻松地实现各种排序需求,并且可以方便地链式调用方法来定制和增强现有的比较器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值