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()了。

好了具体的程序我们自己实际操作一下,在理解理解就可以掌握了。。



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