今天我們來看一下Guava的排序,正好可以和我們之前的Java排序進行對比,我們可以看看到底Guava使怎樣的將排序做到流暢。。。
首先我們要知道Guava中的排序器是Ordering,顧名思義,就是秩序,制度啦,也就是說我們觀看名字就能理解其的作用和目的啦,所以我們也要向我們的先輩們進行學習那就是名字要起的見名知意,這樣的代碼大家才能更容易理解和接受,還有就是維護。。其實我們在後面的例子中可以很清楚的看到Guava的Ordering排序器可以很方便的實現自定義排序,這個相較於Java的排序有較大的提升。其實我們可以跟進去源碼看一下:
1.Guava的排序Ordering集合排序都是調用的一個接口那就是:
public <E extends T> List<E> sortedCopy(Iterable<E> elements) {
@SuppressWarnings("unchecked") // does not escape, and contains only E's
E[] array = (E[]) Iterables.toArray(elements);
Arrays.sort(array, this);
return Lists.newArrayList(Arrays.asList(array));
}
其實看一下這個接口也是刻可以明白的,他就是接受一個泛型的Iterable對象,這就是說,只要是一個可以遍歷的對象傳入都是OK的。爲什麼我們定義的集合可以而單個的對象比如String str = "麗麗"; 不行呢,其實是因爲我們所有的集合類型都繼承自Collection而Collection集合裏面就有一個迭代器。
好了我們言歸正傳,我們調用這個統一的入口就可以實現我們的排序,就是根據你傳入的參數的類型進行排序的,可以是自然須,字典序,無序等等。。。我們先來看一下我們平時常用的幾個排序的靜態方法:
natural():對傳入的參數進行自然排序,例如:String排字典序,Int排大小。。。
usingToString():排字典序。
artibrary():無序。每次的排序結果都不同。
好了上代碼:
import com.google.common.collect.Lists; import com.google.common.collect.Ordering; import java.util.List; /** * Created by luyangli on 15-9-17. */ public class OrderingTest1 { public static void main(String[] args) { List<String> stringList = Lists.newArrayList(); stringList.add("luluyang"); stringList.add("songyangjia"); stringList.add("chagnhaha"); stringList.add("buzhidaohaofanaaaaaaaa"); stringList.add("wozhedebuzhidaoa"); //String str = "lili"; System.out.println("=====================原List======================"); System.out.println("striongList:" + stringList); System.out.println(); Ordering<String> natural = Ordering.natural(); Ordering<Object> usingToString = Ordering.usingToString(); Ordering<Object> arbitrary = Ordering.arbitrary(); System.out.println("=====================natural(自然序)======================"); stringList = natural.sortedCopy(stringList); System.out.println("natural:" + stringList); System.out.println(); System.out.println("=====================natural(字典序)======================"); stringList = usingToString.sortedCopy(stringList); System.out.println("usingToString:" + stringList); System.out.println(); System.out.println("=====================natural(無序)======================"); stringList = arbitrary.sortedCopy(stringList); System.out.println("arbirary:" + stringList); System.out.println(); Ordering<Integer> orderingBig = new Ordering<Integer>() { @Override public int compare(Integer left, Integer right) { return left - right; } }; List<Integer> integerList = Lists.newArrayList(); integerList.add(3); integerList.add(4); integerList.add(5); integerList.add(7); integerList.add(2); integerList.add(9); integerList.add(8); integerList.add(1); integerList.add(0); integerList = orderingBig.sortedCopy(integerList); System.out.println("interList:" + integerList); } }
我們看一下結果把:
=====================原List====================== striongList:[luluyang, songyangjia, chagnhaha, buzhidaohaofanaaaaaaaa, wozhedebuzhidaoa] =====================natural(自然序)====================== natural:[buzhidaohaofanaaaaaaaa, chagnhaha, luluyang, songyangjia, wozhedebuzhidaoa] =====================natural(字典序)====================== usingToString:[buzhidaohaofanaaaaaaaa, chagnhaha, luluyang, songyangjia, wozhedebuzhidaoa] =====================natural(無序)====================== arbirary:[songyangjia, chagnhaha, buzhidaohaofanaaaaaaaa, luluyang, wozhedebuzhidaoa] interList:[0, 1, 2, 3, 4, 5, 7, 8, 9]
在最後一段我還實現了一個自定義的排序器,這個是不是相較於Java的排序有很大的好處呢再也不用怕沒有調用Collections.sort()了。
好了具體的程序我們自己實際操作一下,在理解理解就可以掌握了。。