2013-05-23 10 views
8

「マルチセットの最初の項目を選択するにはどうすればよいですか?」という質問に言いたいことがあります。 Multisetは既に周波数に従って並べられているようです。マルチセットで最大発生数を持つ要素を選択

私はMultiset myList = Multiset.create()を持っています。

[maa00 mfnt11 malignlft mbold mlt18 mfl x 3, caa00 cfnt11 calignlft cbold clt17 cfl] 

myList.getIndex(0)のようなメソッドが見つかりませんでした。最後に、最大の頻度を持つ要素の数が必要であることに注意してください。

これには1つのライナーがありますか?あるいは私はその反復をしなければならないのですか?

アップデート: 私が使用して最大周波数を取得しています:

myList.count(Multisets.copyHighestCountFirst(myList).asList().get(0))); 

しかし、これは遅すぎます。私は正確に何を使うべきですか?

更新1:上記のcopyHighestCountFirstメソッドの使用が遅すぎることが判明しています。あるループのインスタンスでは、ループなしで平均40ミリ秒に対抗して80ミリ秒かかることになります。 大きなループでは、単純な反復を好むべきですか?

アップデート2:

myList.count(myList.entrySet().iterator().next().getElement()) 

をパフォーマンスにほとんど影響を与えずにゼロ:それは使用して作業しました。私はまだそれを行うための良い方法があるのだろうかと思っています。

追記:それはあなたが望むものをはっきりしていない編集内容とフレージングのので

j = defaultdict(int) 
for k in clList: 
    j[k] +=1 
result1 = max(j.iteritems(), key=lambda x:x[1]) //count of frequency of item with max count 

答えて

14

あり、あなたの質問や他の回答投稿の間の周りに投げ選択肢がたくさんあったが、それらの多くは.get(0).iterator().next()あなたが最も頻繁に要素を取得しようとしているという考えに依存するように見えるです。ならない!

あなたが言ったように無駄だMultisets.copyHighestCountFirst(bag).elementSet().iterator().next()です。手動でentrySetをループし、これまでに最も頻繁に確認してください。

最も頻繁な要素を抽出するために、Guava機能要求を提出する必要があります。私はそれに何が起こると約束することはできませんが、それは要請する価値があります。

2

:Pythonでは私は同じことをやりました。また、マルチセットである変数名にmyListを使用することは記述的ではありません。マルチセットの変数名としてbagを使用します(結局はバッグです)。

  1. 多重集合がすでに周波数に従って順序付けされているようだ」 - それがあるか、それは周波数に従って順序付けされていませんか?

    ImmutableMultiset<String> bag = ImmutableMultiset.of(
        "c0ffee", "abba", "mfl", "mfl", "mfl", "c0ffee"); 
    

    (それがここの場合であれば、私は知らない)それが挿入順序を使用していますので、あなたのコレクション偶然によって適切に注文することができるので、[c0ffee x 2, abba, mfl x 3]です。ご注文についてわからない場合は、[mfl x 3, c0ffee x 2, abba]を示す

    をご利用ください。 Multisets.copyHighestCountFirstは不変マルチセットを返しますので、マルチセットが変更されないと仮定してループ内で使用する必要はありません。愚かなマイクロベンチマークを行っただけで、Multisets.copyHighestCountFirstを使用した場合、80ミリ秒と40ミリ秒の2倍の遅さがあることが分かりました。premature optimization is the root of all evilが原因です。私はこの時点でsortedBagを正しく注文したと仮定します。私はあなたが望む表示されるものと

  2. 単に袋で最も一般的な要素の数:sortedBag.entrySet()がある

    int count = sortedBag.entrySet().asList().get(0).getCount(); 
    

    注こと:

    int count = sortedBag.entrySet().iterator().next().getCount(); 
    

    たり、多重集合がImmutableMultisetであるかの

    要素とカウントの両方を持つMultiset.Entryのコレクションので、あなたが望むものを選んでください。

    sortedBag.asList().get(0) 
    

    あなたに(ここでは:文字列)のみの要素を与える:ImmutableMultisetを持つ

  3. は、あなたがそれはあなたが要素フェッチするget(0)を呼び出すことができますどのImmutableListビューの使用を可能にすると、カウントせずに、あなたの計画がある場合はそう要素のみをフェッチするには、イテレータで再生する代わりにasList()を使用できます。

+0

あろう今それを得た。ありがとう。 – akshayb

3

明示的なループを必要としない一の代替ソリューション - しかし、異なる要素の数に線形時間で実行されます、これらの他のソリューションのほとんどはできない - I

Ordering.natural().onResultOf(new Function<Multiset.Entry<Foo>, Integer>() { 
    public Integer apply(Multiset.Entry<Foo> entry) { 
    return entry.getCount(); 
    } 
}.max(multiset.entrySet()).getElement(); 
関連する問題