6

Guava がMultiset<Integer>あり、(a) 要素値と (b) 要素数でソートされたエントリを個別に反復処理したいと考えています。要素頻度の順に Multiset を反復する最も簡単な方法を使用しましたか? なので

ImmutableMultiset<Integer> entryList = Multisets.copyHighestCountFirst(myIntegerMultiset);
for (Integer i : entryList) {
    System.out.println("I"+i);
}

しかし、これはすべてのエントリを返しますがMultiset.Entry<Integer>、カウントを取得できるソートされたリスト (一意の値ごとに 1 つ) が必要です。

Multiset.Entry<Integer>独立して、の値でソートされた同じリストを取得したいと思います<Integer>

4

2 に答える 2

11
Iterable<Multiset.Entry<Integer>> entriesSortedByCount = 
   Multisets.copyHighestCountFirst(multiset).entrySet();
Iterable<Multiset.Entry<Integer>> entriesSortedByValue =
   ImmutableSortedMultiset.copyOf(multiset).entrySet();

entrySet()基本的に、それ自体を反復するのではなく、 , だけが必要ですMultiset

于 2013-09-30T17:44:58.890 に答える
2

一連のエントリを取得して、必要に応じて並べ替えることができます。

一連のエントリを取得する方法は次のとおりです。

Set<Multiset.Entry<Integer>> entries = myIntegerMultiset.entrySet();

そして、並べ替えるために、2 つのコンパレーターを定義できます。

Comparator<Multiset.Entry<Integer>> byCount = new Comparator<Multiset.Entry<Integer>>() {
    int compare(Multiset.Entry<Integer> e1, Multiset.Entry<Integer> e2) {
        return e2.getCount() - e1.getCount();
    }
}

Comparator<Multiset.Entry<Integer>> byValue = new Comparator<Multiset.Entry<Integer>>() {
    int compare(Multiset.Entry<Integer> e1, Multiset.Entry<Integer> e2) {
        return e2.getElement() - e1.getElement();
    }
}

次に、並べ替えられたコレクションを取得するためにツリー セットにコンパレータを提供できます。

Set<Multiset.Entry<Integer>> entries = myIntegerMultiset.entrySet();
Set<Multiset.Entry<Integer>> entriesSortedByCount = Sets.newTreeset(byCount);
entriesSortedByCount.addAll(entries);
Set<Multiset.Entry<Integer>> entriesSortedByValue = Sets.newTreeset(byValue);
entriesSortedByValue.addAll(entries);

実際には、Louis Wasserman の回答の方がはるかに優れていますが、並べ替えをカスタマイズしたい場合に備えて、これも投稿します。

于 2013-09-30T17:48:41.687 に答える