Guava(三):流暢的排序

     今天我們來看一下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()了。

好了具體的程序我們自己實際操作一下,在理解理解就可以掌握了。。



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