2010-06-12 72 views
13

A Google CollectionsMultiset是其中每一个都具有计数(即可能存在多次)的一组元素。从Google Collections中查找Multiset中的前N个元素?

我不能告诉你多少次,我要做到以下几点

  1. 做一个直方图(正好多集)
  2. 获得通过计数从直方图的前N个元素

示例:排名前10的网址(按#次提到),排名前10的代码(按#次应用),...

给出Google Collections Multiset的规范#2的规范方法是什么?

Here是一篇关于它的博客文章,但该代码并不是我想要的。首先,它返回所有内容,而不仅仅是顶部N.第二,它复制(可以避免复制?)。第三,我通常需要一个确定性的排序,即如果计数相等,则进行抢七。其他尼特:它不是静态的,等

回答

4

我写的方法与你所要求的基本功能,除了他们执行副本并缺乏确定性的打破僵局逻辑。他们目前是Google的内部人员,但我们可能会在某些时候开源。这种番石榴issue有方法签名。

他们的算法类似于博客文章:排序条目列表。使用更好的selection algorithm会更快但更复杂。

编辑:自番石榴11,这是implemented

+0

如何使用它来获得前N个元素? – 2015-10-09 13:31:09

3

为了给另一个角度为人们发表评论,我会发布的博客文章引用我的一个稍作修改的版本:

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; 
    } 
} 
+0

如果我理解正确的话,这个解决方案将复制要检索前N个元素每次排序的整个集合。我不确定你的要求是什么,但堆排序ish解决方案在时间和空间上都能胜出,所以我不确定它的好处是什么。 – danben 2010-06-12 19:44:25

+0

您正在为速度进行优化,我正在寻找我编写的最少的代码行。 – dfrankow 2010-06-14 13:59:18

+0

我明白了 - 从您的帖子中看不清楚,特别是因为您询问了有关避免制作副本。 – danben 2010-06-14 14:30:00