Google コレクションからマルチセット内の上位 N 個の要素を見つけますか?

StackOverflow https://stackoverflow.com/questions/3029151

  •  26-09-2019
  •  | 
  •  

質問

Google コレクション マルチセット 要素のセットであり、それぞれにカウントがあります (つまり、複数回存在する可能性があります)。

次のことを何度やりたいかわかりません

  1. ヒストグラムを作成します (正確にはマルチセット)
  2. ヒストグラムからカウントにより上位 N 個の要素を取得します

例:上位 10 URL (# 回言及)、上位 10 タグ (# 回適用)、...

Google コレクション マルチセットを考慮して #2 を実行する正規の方法は何ですか?

ここ はそれに関するブログ投稿ですが、そのコードは私が望むものではありません。まず、上位 N だけではなく、すべてが返されます。次に、コピーされます (コピーを回避することは可能ですか?)。第三に、私は通常、決定論的なソートが必要です。カウントが等しい場合はタイブレーク。その他のニット:静的ではないなど。

役に立ちましたか?

解決

私はあなたが求めている基本的な機能を備えたメソッドを作成しましたが、コピーを実行し、決定的なタイブレークロジックが欠けている点が異なります。これらは現在 Google の内部にありますが、いつかオープンソース化する可能性があります。このグアバ 問題 にはメソッドのシグネチャがあります。

彼らのアルゴリズムはブログ投稿に似ています。エントリのリストを並べ替えます。より良いものを使用すると、より速くなりますが、より複雑になります。 選択アルゴリズム.

編集:グアバ 11 以来、これは 実装されました

他のヒント

上のコメントへの人々のために別の視点を与えるために、

私は、参照ブログの記事を少し変更したバージョン投稿します、:

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;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top