9

質問を「マルチセットの最初の項目を選択するにはどうすればよいですか?」と言い換えたいと思うかもしれません。マルチセットはすでに周波数に従って並べ替えられているようです。

マルチセット myList = Multiset.create(); があります。

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

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

このためのライナーはありますか?それとも、その反復を行う必要がありますか?

更新:次を使用して最大周波数を取得しています:

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

しかし、これは遅すぎます。正確に何を使用すればよいですか?

更新 1: 上記の copyHighestCountFirst メソッドを使用すると、遅すぎることがわかります。ループの 1 つのインスタンスでは、ループなしで使用すると平均 40 ミリ秒かかるのに対し、80 ミリ秒以上かかります。大規模なループでは、単純な反復を優先する必要がありますか?

更新2:次を使用して動作しました:

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

パフォーマンスへの影響はほとんどありません。何か良い方法はないかと今でも考えています。

Sidenote : Python では、次のように同じことを行いました:

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
4

4 に答える 4

15

あなたの質問と投稿された他の回答の間には多くの代替案が投げかけられてきましたが、それらの多くは、最も頻繁な要素を取得する、.get(0)または取得しようとしているという考えに依存しているようです. .iterator().next()ならない!

あなたの唯一の適切な選択肢はMultisets.copyHighestCountFirst(bag).elementSet().iterator().next()、あなたが言うように無駄です、またはentrySet手動でループして、これまでで最も頻繁であるかどうかを確認することです。

最も頻繁に使用される要素を抽出するには、Guava 機能要求を提出する必要があります。何が起こるかは約束できませんが、リクエストする価値はあります。

于 2013-05-24T19:27:21.460 に答える
4

明示的なループを必要としない代替ソリューションの 1 つ - ただし、これらの他のソリューションのほとんどでは実行できない、個別の要素の数で線形時間で実行される - は次のようになります。

Ordering.natural().onResultOf(new Function<Multiset.Entry<Foo>, Integer>() {
  public Integer apply(Multiset.Entry<Foo> entry) {
    return entry.getCount();
  }
}.max(multiset.entrySet()).getElement();
于 2013-05-24T23:44:23.920 に答える
2

あなたの編集と言い回しのために、あなたが何を望んでいるかは明確ではありません. また、マルチセットである変数名としてmyList使用することは説明的ではありません-マルチbagセットの変数名として使用します(結局バッグです)。

  1. マルチセットはすでに周波数に従って並べられているようです」-周波数に従って並べられていますか?

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

    挿入順を使用している[c0ffee x 2, abba, mfl x 3]ため、偶然にもコレクション適切に順序付けられている可能性があります (ここでのケースかどうかはわかりません)。注文についてよくわからない場合は、

     ImmutableMultiset<String> sortedBag = Multisets.copyHighestCountFirst(bag)
    

    を与え[mfl x 3, c0ffee x 2, abba]ます。不変のマルチセットを返すためMultisets.copyHighestCountFirst、マルチセットが変更されないと仮定してループで使用する必要はありません。ばかげたマイクロベンチマークを行ったばかりで、使用Multisets.copyHighestCountFirstが 80 ミリ秒と 40 ミリ秒の 2 倍遅いことがわかった場合は、時期尚早の最適化がすべての悪の根源であるため、忘れてください。sortedBagこの時点で適切に注文したと思います。

  2. 私が見たところ、バッグ内の最も一般的な要素の数が必要です。これは単純です:

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

    または、マルチセットが次の場合ImmutableMultiset:

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

    要素とカウントの両方を持つsortedBag.entrySet()コレクションなので、必要なものを選択してください。Multiset.Entry

  3. 持つことで、要素を取得するために呼び出すことができるビューImmutableMultisetを使用できます。ImmutableListget(0)

    sortedBag.asList().get(0)
    

    これにより、カウントのない要素 (ここでは文字列) のみが得られるため、要素のみを取得する計画がある場合はasList()、イテレータで遊ぶ代わりに使用できます。

于 2013-05-23T15:23:15.223 に答える