2010-06-12 76 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