關於排序html
Guava的鏈式比較器java
例子git
assertTrue(byLengthOrdering.reverse().isOrdered(list));app
梗概函數
Ordering是Guava的鏈式比較器類,能夠被用做構造複雜的比較器,並應用到collection對象。this
它的本質就僅僅是一個特殊的比較器實例。Ordering僅僅是執行一些依賴一個比較器的方法(譬如 Collections.max),而且把這些方法做爲實例的的方法使用。Ordering類提供一些方法去調整和增強已經存在的比較器。google
怎樣建立一個Orderingspa
普通的orderings由下面的靜態方法建立。code
Methodhtm |
Description |
將能比較的對象按照天然順序排序 |
|
使用toString()返回的字符串按字典順序進行排序 |
|
使用一個已經存在的比較器 |
可是,去建立一個Ordering 更通常的方法是徹底跳過Comparator,直接去繼承一個Ordering抽象類。
鏈式比較
1 Ordering<String> byLengthOrdering = new Ordering<String>() { 2 public int compare(String left, String right) { 3 return Ints.compare(left.length(), right.length()); 4 } 5 };
給予一個Ordering就能被包裝,去得到派生的Orderings.下面是一些常常用到的變體方法。
Method |
Description |
返回一個順序相反的Ordering. |
|
返回一個Ordering.,非空值優先輸出,其他和最初的Ordering同樣 |
|
當第一個比較器比較相等時使用第二個比較器。 |
|
Returns an Ordering that orders iterables lexicographically by their elements. 返回一個比較器,按照字典順序遍歷它的元素 |
|
返回一個比較器,它將函數應用到它的元素,而後按照最初的比較器將元素排序。 |
譬如,當你想要一個能將下面的類比較的比較器。。。
1 class Foo { 2 @Nullable String sortedBy; 3 int notSortedBy; 4 }
它能處理空的sortedBy。這兒是一種創建在鏈式方法的解決方案。
1 Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() { 2 public String apply(Foo foo) { 3 return foo.sortedBy; 4 } 5 });
當讀到一個鏈式Ordering.的時候,從右往左看。上面的例子對Foo的實例排序是按照查找他們的屬性值sortedBy,首先移動非空值到頂部,而後對他們的其他值進行排序。從後往前看是由於每個鏈式調用都是包裝前一個Ordering 成爲一個新的Ordering 。
(從後向前見解則的特例:如果鏈條中有compound,從左向後讀。爲了不迷惑,不要將包含 compound的調用和別的鏈式調用混合在一塊兒。)
太長的鏈式不容易理解,咱們建議像例子那樣將鏈式限制在3個回調。即便如此,你仍能夠像Function 的實例那樣經過分割出中間對象來簡化鏈式。
1 Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(sortKeyFunction);
關於應用
Guava提供許多方法去利用ordering 處理和檢查值或者集合。咱們在下面列出如下一些常常用到的。
Method |
Description |
See also |
Returns the k greatest elements of the specified iterable, according to this ordering, in order from greatest to least. Not necessarily stable. |
||
Tests if the specified Iterable is in nondecreasing order according to this ordering. |
||
Returns a sorted copy of the specified elements as a List. |
||
Returns the minimum of its two arguments according to this ordering. If the values compare as equal, the first argument is returned. |
||
Returns the minimum of its arguments according to this ordering. If there are multiple least values, the first is returned. |
||
Returns the minimum element of the specified Iterable. Throws a NoSuchElementException if theIterable is empty. |