13

Google Collections Multisetは、それぞれがカウントを持つ (つまり、複数回存在する可能性がある) 要素のセットです。

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

  1. ヒストグラムを作成する (正確には Multiset)
  2. ヒストグラムからカウントごとに上位 N 個の要素を取得する

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

Google Collections マルチセットを指定して #2 を行う標準的な方法は何ですか?

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

4

2 に答える 2

4

私はあなたが求めている基本的な機能を備えたメソッドを書きましたが、それらはコピーを実行し、確定的なタイブレーク ロジックを欠いています。それらは現在 Google の内部にありますが、いずれオープンソース化する可能性があります。この Guavaの問題には、メソッドの署名があります。

彼らのアルゴリズムはブログ投稿に似ています: エントリのリストを並べ替えます。より優れた選択アルゴリズムを使用する方が高速ですが、より複雑になります。

編集:Guava 11以降、これが実装されています

于 2010-06-17T04:27:05.080 に答える
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;
    }
}
于 2010-06-12T18:25:50.443 に答える