Ordering类-greatestOf

Ordeing是Guava类库提供的一个强大的比较器工具,可以构造复杂的comparator,然后用在容器的比较、排序等操作中。

其本质上来说是一个特殊的Comparator实例。 

1、greatestOf  

 greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。

还是先看一下函数的使用:

List names= Lists.newArrayList("cici","bobo","dodo","eva","haha","lala");
Ordering naturalOrdering = Ordering.natural();
System.out.println("greatestOf:"+naturalOrdering.greatestOf(names, 3));

输出结果为:greatestOf:[lala, haha, eva],按照从大到小排序,要求迭代到第三个。

2、看一下源码的实现:

public  List greatestOf(Iterable iterable, int k) {
    return this.reverse().leastOf(iterable, k);
}

它调用reverse()方法,和leastof(iterable, k)方法

先看一下leastof方法:

public  List leastOf(Iterable iterable, int k) {
    if (iterable instanceof Collection) {
        Collection collection = (Collection)iterable;
        if ((long)collection.size() <= 2L * (long)k) {      //6<=2*3
            E[] array = (Object[])collection.toArray();//强转为数组,然后排序
            Arrays.sort(array, this);//进行排序
            if (array.length > k) {//6>3
                array = Arrays.copyOf(array, k);//copyOf(array,3)
            }  //复制前k位 

            return Collections.unmodifiableList(Arrays.asList(array));
        }
    }

    return this.leastOf(iterable.iterator(), k);
}

 

public  List leastOf(Iterator iterator, int k) {
    Preconditions.checkNotNull(iterator);//先检查判空情况
    CollectPreconditions.checkNonnegative(k, "k");
    if (k != 0 && iterator.hasNext()) {
        if (k >= 1073741823) {//Integer.MAX_VALUE 
            ArrayList list = Lists.newArrayList(iterator);
            Collections.sort(list, this);//直接对list进行排序
            if (list.size() > k) {
                list.subList(k, list.size()).clear();
            }

            list.trimToSize();
            return Collections.unmodifiableList(list);
        } else {
            //长度没有超过最大值,就调用TopKSelector排序
            TopKSelector selector = TopKSelector.least(k, this);
            selector.offerAll(iterator);
            return selector.topK();
        }
    } else {//if(k==0)
        return Collections.emptyList();
    }
}

 

你可能感兴趣的:(JAVA)