Google コレクションからマルチセット内の上位 N 個の要素を見つけますか?
質問
あ Google コレクション マルチセット 要素のセットであり、それぞれにカウントがあります (つまり、複数回存在する可能性があります)。
次のことを何度やりたいかわかりません
- ヒストグラムを作成します (正確にはマルチセット)
- ヒストグラムからカウントにより上位 N 個の要素を取得します
例:上位 10 URL (# 回言及)、上位 10 タグ (# 回適用)、...
Google コレクション マルチセットを考慮して #2 を実行する正規の方法は何ですか?
ここ はそれに関するブログ投稿ですが、そのコードは私が望むものではありません。まず、上位 N だけではなく、すべてが返されます。次に、コピーされます (コピーを回避することは可能ですか?)。第三に、私は通常、決定論的なソートが必要です。カウントが等しい場合はタイブレーク。その他のニット:静的ではないなど。
他のヒント
上のコメントへの人々のために別の視点を与えるために、
私は、参照ブログの記事を少し変更したバージョン投稿します、:
を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;
}
}
所属していません StackOverflow