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
static <T,U extends Comparable<? super U>> Comparator<T>  comparing( Funcation<? super T,? extends U> keyExtractor );

創建出一個比較器,參數 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));
static <T,U> Comparator<T>  comparing( Funcation<? super T,? extends U> keyExtractor , Comparator<? super U> keyComparator);

創建出一個比較器,參數 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的,全都排在最前

Arrays.sort(students, nullsFirst(comparing(Student::getName));

還有nullsLast

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章