比较器例子
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):返回指定的元素作为一个列表的排序副本。