天天看点

jdk8的比较与排序(Comparator & sort):Core Java

Comparable

public interface Comparable<T>{
	int compareTo(T other);
}
           

这是一个函数式接口,用于比较和排序,jdk提供了一些工具类对一组对象进行排序,前提是这些对象所属类必须实现了

Comparable

接口的

compareTo()

方法,例如:

Arrays.sort(Object[] a);  ///要求a中的元素的实际类型必须是Comparable接口的实现类;

 static <T extends Comparable<? super T>> Collections.sort(List<T> list) // 要求类型T必须是Comparable接口的实现类
           

JDK的八大基本类型的封装类都实现了Comparable接口。

Comparator

Core Java 6.3.8

Comparator提供了许多静态方法和默认方法,为大数据的比较和排序提供了支持。

对于静态方法,调用格式是:

Comparator.<T>method()

如获取String类的比较器:

Comparator.<String>naturalOrder();

如果做了静态导入,类型又能推导出来,则直接方法名即可

import static java.util.Comparator.*;
...
Arrays.sort(strings, naturalOrder());
           

Comparator中的API

static <T> Comparator<T> nullsFirst();  // null小于所有值
static <T> Comparator<T> nullsLast();  //null值大于所有值

static <T extends Comparable<? super T>> Comparator<T> naturalOrder();  // 如果某类型实现了Comparable接口,那么此方法能调用类型的comapareTo()方法去构造出一个Comparator

default Comparator<T> reversed();  // 一个反序的比较器

static <T extends Comparable<? super T>>  Comparator<T>  reverseOrder(); // 构造一个与类型T的compareTo()方法的排序相反的比较器

default Comparator<T>  comparaing( Funcation<T,R> keyExtractor );  //构造一个比较器,参数 keyExtractor 是一个函数式接口,用来确定根据类型T的哪个域做比较,

           
comparing

创建出一个比较器,参数 keyExtractor 是一个函数式接口,用来确定根据类型T的哪个域排序,要求域的类型U必须实现了Comparable接口。

例如:根据Person类型的name字段对一个Person[]数组排序

Arrays.sort(people,
			Comparator.<Person,String>comparing(
				(Person person)->{return person.getName();}
			)
		);
// 以上代码可以简写如下:
import static java.util.Comparator.*;
...
Arrays.sort(people,comparing(Person::getName));
           

创建出一个比较器,参数 keyExtractor 是一个函数式接口,用来确定根据类型T的哪个域排序;参数keyComparator是一个类型U的比较器。

其变体有:

comparingInt(ToIntFunction<? super T>  keyExtractor); //keyExtracotr的返回的域类型必须是Int

// 还有comparingLong / comparingDouble
           
thenComparing

例如:对于类Student,先按照name排序,如果name相同,则再按照age排序。

Arrays.sort(students,
	comparing(Student::getName).thenComparingInt(Student::getAge))
           
排序中遇到null时的处理

nullsFirst(Comparator<? super T> comparator)

例如,按照name对Student排序,如果遇到name为null的,全都排在最前

还有

nullsLast