从Google Collections中查找Multiset中的前N个元素?
问题描述:
A Google CollectionsMultiset是其中每一个都具有计数(即可能存在多次)的一组元素。从Google Collections中查找Multiset中的前N个元素?
我不能告诉你多少次,我要做到以下几点
- 做一个直方图(正好多集)
- 获得通过计数从直方图的前N个元素
示例:排名前10的网址(按#次提到),排名前10的代码(按#次应用),...
给出Google Collections Multiset的规范#2的规范方法是什么?
Here是一篇关于它的博客文章,但该代码并不是我想要的。首先,它返回所有内容,而不仅仅是顶部N.第二,它复制(可以避免复制?)。第三,我通常需要一个确定性的排序,即如果计数相等,则进行抢七。其他尼特:它不是静态的,等
答
我写的方法与你所要求的基本功能,除了他们执行副本并缺乏确定性的打破僵局逻辑。他们目前是Google的内部人员,但我们可能会在某些时候开源。这种番石榴issue有方法签名。
他们的算法类似于博客文章:排序条目列表。使用更好的selection algorithm会更快但更复杂。
编辑:自番石榴11,这是implemented
答
为了给另一个角度为人们发表评论,我会发布的博客文章引用我的一个稍作修改的版本:
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;
}
}
如何使用它来获得前N个元素? – 2015-10-09 13:31:09