03-Comparator 和 Ordering

Posted 程序员008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03-Comparator 和 Ordering相关的知识,希望对你有一定的参考价值。

 

比较器例子

import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class ObjectsTest {

    public static void main(String[] args) {
        objToString();
    }

    public static void objToString() {
        Person zs1 = new Person("zs", 1, 28);
        Person zs2 = new Person("zs", 1, 30);
        Person zs3 = new Person("zs", 1, 29);
        Person zs4 = new Person("ls", 1, 28);
        Person zs5 = new Person("ls", 1, 28);
        Person zs6 = new Person("ls", 1, 28);
        List<Person> personList = Arrays.asList(zs1, zs2, zs3, zs4, zs5, zs6);

        // 名称正序相同的话年龄正序
        Comparator<Person> comparator1 = new Comparator<Person>() {
            public int compare(Person p1, Person p2) {
                return ComparisonChain.start()
                        .compare(p1.getName(), p2.getName())//名称正序
                        .compare(p1.getAge(), p2.getAge())//年龄正序
                        .result();
            }
        };
        personList.sort(comparator1);
        System.out.println(personList);

        // 名称正序相同的话年龄反序
        Comparator<Person> comparator2 = new Comparator<Person>() {
            public int compare(Person p1, Person p2) {
                return ComparisonChain.start()
                        .compare(p1.getName(), p2.getName())//名称正序
                        .compare(p2.getAge(), p1.getAge())//年龄反序
                        .result();
            }
        };
        personList.sort(comparator2);
        System.out.println(personList);

        // 名称正序相同的话年龄正序(不用)
        Ordering<Person> ordering1 = new Ordering<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return ComparisonChain.start()
                        .compare(p1.getName(), p2.getName())
                        .compare(p1.getAge(), p2.getAge())
                        .result();
            }
        }.nullsFirst();
        personList.sort(ordering1);
        System.out.println(personList);

        // 名称正序相同的话年龄反序(不用)
        Ordering<Person> ordering2 = new Ordering<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return ComparisonChain.start()
                        .compare(p1.getName(), p2.getName())
                        .compare(p1.getAge(), p2.getAge())
                        .result();
            }
        }.nullsFirst();
        personList.sort(ordering2);
        System.out.println(personList);
    }
}

 

操作方法:

natural():使用Comparable类型的自然顺序, 例如:整数从小到大,字符串是按字典顺序;
usingToString() :使用toString()返回的字符串按字典顺序进行排序;
arbitrary() :返回一个所有对象的任意顺序, 即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是没有任何含义, 但是在VM的生命周期是一个常量。
reverse(): 返回与当前Ordering相反的排序:
nullsFirst(): 返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
nullsLast():返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
compound(Comparator):返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;
lexicographical():返回一个按照字典元素迭代的Ordering;
onResultOf(Function):将function应用在各个元素上之后, 在使用原始ordering进行排序;
greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。
leastOf(Iterable<E> iterable,int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。
isOrdered(Iterable):是否有序,Iterable不能少于2个元素。
isStrictlyOrdered(Iterable):是否严格有序。请注意,Iterable不能少于两个元素。
sortedCopy(Iterable):返回指定的元素作为一个列表的排序副本。

以上是关于03-Comparator 和 Ordering的主要内容,如果未能解决你的问题,请参考以下文章

eShopOnContainers 知多少[8]:Ordering microservice

Guava ---- Ordering排序工具

Guava源码学习Ordering

php 删除catalog_ordering和result_count

Scala比较器:Ordered与Ordering

在这个 spark 代码片段中 ordering.by 是啥意思?