Ordering类-greatestOf

本文详细介绍了Guava库中的Ordering工具类,重点讲解了greatestOf方法的使用及其实现原理,包括如何通过反转比较器来获取集合中最大的k个元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1、greatestOf  

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

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

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

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

2、看一下源码的实现:

public <E extends T> List<E> greatestOf(Iterable<E> iterable, int k) {
    return this.reverse().leastOf(iterable, k);
}

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

先看一下leastof方法:

public <E extends T> List<E> leastOf(Iterable<E> iterable, int k) {
    if (iterable instanceof Collection) {
        Collection<E> 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 <E extends T> List<E> leastOf(Iterator<E> iterator, int k) {
    Preconditions.checkNotNull(iterator);//先检查判空情况
    CollectPreconditions.checkNonnegative(k, "k");
    if (k != 0 && iterator.hasNext()) {
        if (k >= 1073741823) {//Integer.MAX_VALUE 
            ArrayList<E> 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<E> selector = TopKSelector.least(k, this);
            selector.offerAll(iterator);
            return selector.topK();
        }
    } else {//if(k==0)
        return Collections.emptyList();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值