###1.簡介 Ordering 例項無非就是一個特殊的Comparator 例項。Ordering只是需要依賴於一個比較器(例如,Collections.max)的方法,並使其可作為例項方法。另外,Ordering提供了鏈式方法呼叫和加強現有的比較器,可以輕鬆構造複雜的comparator。 ###2.例項 場景是對一個list中的元素按照一定規則排序,首先我們新建一個TestOrder類:
import com.sun.istack.internal.Nullable;
import lombok.Data;
@Data
public class TestOrder {
@Nullable
private Integer id;
private String msg;
public TestOrder(Integer id,String msg){
this.id = id;
this.msg = msg;
}
}
複製程式碼
我們要按照TestOrder中的ID進行排序,一般情況下有兩種方式,一種就是迴圈 list並按照規則將TestOrder插入新的list;另一種方式是實現Comparable介面。我們使用Guava只需要如下程式碼:
@Test
public void test(){
TestOrder testOrder1 = new TestOrder(1,"test1");
TestOrder testOrder2 = new TestOrder(2,"test2");
TestOrder testOrder3 = new TestOrder(3,"test3");
TestOrder testOrderNull = new TestOrder(null,"null");
List<TestOrder> listResource = Lists.newArrayList(testOrderNull,testOrder1,testOrder3,testOrder2);
System.out.println(listResource.toString());
/*****************************
*guava Ordering編寫比較器
*****************************/
Ordering<TestOrder> ordering = Ordering.natural().nullsLast().onResultOf(new Function<TestOrder, Integer>() {
public Integer apply(TestOrder testOrder) {
return testOrder.getId();
}
});
/*****************************
*guava Ordering比較器結束
*****************************/
System.out.println(ordering.sortedCopy(listResource));
}
複製程式碼
控制檯輸出為: [TestOrder(id=null, msg=null), TestOrder(id=1, msg=test1), TestOrder(id=3, msg=test3), TestOrder(id=2, msg=test2)] [TestOrder(id=1, msg=test1), TestOrder(id=2, msg=test2), TestOrder(id=3, msg=test3), TestOrder(id=null, msg=null)] 其中比較器部分就是我們的比較規則,然後呼叫ordering的sortedCopy方法就會返回一個按照比較器排序的list了。 那麼為什麼叫鏈式風格呢?比如我們寫的這個比較器,要從最後的呼叫往前讀,也就是: 1.執行apply方法得到ID 2. nullsLast把為ID為null的放到最後 3.按照ID的自然規則排,ID是數字也就是從小到大,時間等型別同理 所以如果是一個很複雜的比較器的話,鏈式風格就很易讀了,清晰明瞭 ###3.參考 建立排序器:常見的排序器可以由下面的靜態方法建立
| 方法 | 描述 | | natural() | 對可排序型別做自然排序,如數字按大小,日期按先後排序 | | usingToString() | 按物件的字串形式做字典排序[lexicographical ordering] | | from(Comparator) | 把給定的Comparator轉化為排序器 |
操作方法:
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 iterable,int k):返回指定的第k個可迭代的最小的元素,按照這個從最小到最大的順序。是不穩定的。 isOrdered(Iterable):是否有序,Iterable不能少於2個元素。 isStrictlyOrdered(Iterable):是否嚴格有序。請注意,Iterable不能少於兩個元素。 sortedCopy(Iterable):返回指定的元素作為一個列表的排序副本。