[技術翻譯]Guava官方文檔Ordering

關於排序html

Guava的鏈式比較器java

例子git

assertTrue(byLengthOrdering.reverse().isOrdered(list));app

梗概函數

Ordering是Guava的鏈式比較器類,能夠被用做構造複雜的比較器,並應用到collection對象。this

它的本質就僅僅是一個特殊的比較器實例。Ordering僅僅是執行一些依賴一個比較器的方法(譬如 Collections.max),而且把這些方法做爲實例的的方法使用。Ordering類提供一些方法去調整和增強已經存在的比較器。google

怎樣建立一個Orderingspa

普通的orderings由下面的靜態方法建立。code

Methodhtm

Description

natural()

將能比較的對象按照天然順序排序

usingToString()

使用toString()返回的字符串按字典順序進行排序

Ordering.from(Comparator)

使用一個已經存在的比較器

可是,去建立一個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

reverse()

返回一個順序相反的Ordering.

nullsFirst()

返回一個Ordering.,非空值優先輸出,其他和最初的Ordering同樣

compound(Comparator)

當第一個比較器比較相等時使用第二個比較器。

lexicographical()

Returns an Ordering that orders iterables lexicographically by their elements.

返回一個比較器,按照字典順序遍歷它的元素

onResultOf(Function)

返回一個比較器,它將函數應用到它的元素,而後按照最初的比較器將元素排序。

譬如,當你想要一個能將下面的類比較的比較器。。。

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

greatestOf(Iterable iterable, int k)

Returns the k greatest elements of the specified iterable, according to this ordering, in order from greatest to least. Not necessarily stable.

leastOf

isOrdered(Iterable)

Tests if the specified Iterable is in nondecreasing order according to this ordering.

isStrictlyOrdered

sortedCopy(Iterable)

Returns a sorted copy of the specified elements as a List.

immutableSortedCopy

min(E, E)

Returns the minimum of its two arguments according to this ordering. If the values compare as equal, the first argument is returned.

max(E, E)

min(E, E, E, E...)

Returns the minimum of its arguments according to this ordering. If there are multiple least values, the first is returned.

max(E, E, E, E...)

min(Iterable)

Returns the minimum element of the specified Iterable. Throws a NoSuchElementException if theIterable is empty.

max(Iterable)min(Iterator),max(Iterator)

相關文章
相關標籤/搜索