从 Google 收藏夹的多集中找到前 N 个元素?

2022-09-04 22:50:24

Google 收藏夹多集是一组元素,每个元素都有一个计数(即可以多次存在)。

我不能告诉你我想做多少次以下事情

  1. 制作直方图(正好是多集)
  2. 从直方图中按计数获取前 N 个元素

示例:前 10 个 URL(按提及的次数)、前 10 个标签(按应用次数排序)、...

在给定Google Collections Multiset的情况下,执行#2的规范方法是什么?

这是一篇关于它的博客文章,但该代码并不是我想要的。首先,它返回所有内容,而不仅仅是前 N 个。其次,它复制(是否有可能避免复制?第三,我通常想要一个确定性的排序,即如果计数相等,则决胜局。其他尼特:它不是静态的,等等。


答案 1

我编写了具有您所要求的基本功能的方法,除了它们执行复制并且缺乏确定性的断开逻辑。它们目前是Google的内部,但我们可能会在某个时候开源它们。这个番石榴问题有方法签名。

他们的算法类似于博客文章:对条目列表进行排序。使用更好的选择算法会更快,但更复杂。

编辑:自番石榴11以来,这是实施的


答案 2

为了给人们提供另一个评论的角度,我将发布我引用的博客文章的略微修改版本:

package com.blueshiftlab.twitterstream.summarytools;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multiset;
import com.google.common.collect.Ordering;
import com.google.common.collect.Multiset.Entry;

public class Multisets {
    // Don't construct one
    private Multisets() {
    }

    public static <T> ImmutableList<Entry<T>> sortedByCount(Multiset<T> multiset) {
        Ordering<Multiset.Entry<T>> countComp = new Ordering<Multiset.Entry<T>>() {
            public int compare(Multiset.Entry<T> e1, Multiset.Entry<T> e2) {
                return e2.getCount() - e1.getCount();
            }
        };
        return countComp.immutableSortedCopy(multiset.entrySet());
    }

    public static <T> ImmutableList<Entry<T>> topByCount(Multiset<T> multiset,
            int max) {
        ImmutableList<Entry<T>> sortedByCount = sortedByCount(multiset);
        if (sortedByCount.size() > max) {
            sortedByCount = sortedByCount.subList(0, max);
        }

        return sortedByCount;
    }
}

推荐