1

このようなシナリオがあります。文字列の数を保存する必要があり、最大数を持つ上位 10 個の文字列を返す必要があります。

例えば、

String    Count
---------------------------------
String1   10
String2   9
String3   8 
.
.
.
String10  1 

文字列とその数を格納するためにハッシュテーブルを使用することを考えていましたが、それらを見つけるために再度ループする必要があるため、そこから上位 10 個の文字列を取得するのは困難です。

ここに他の提案はありますか?

4

6 に答える 6

4

優先順位

それに入れるクラスを作ることができます:

public class StringHolder{
    private String string;
    private int value;

    //Compare to and equals methods
}

挿入するとソートされ、トップ10を簡単に取得できます。

于 2012-08-02T14:50:25.583 に答える
3

次のようなソートされたマップを使用するだけです

Map<Integer, List<String>> strings

ここで、キーは頻度の値で、値はその頻度で発生する文字列のリストです。

次に、マップをループし、値リストを 10 個の文字列が表示されるまで内部ループでループします。これらは、最も頻度の高い 10 個です。


アルゴリズムが頻度の更新をサポートする必要があるという追加の要件があります。キーが文字列で、値が実際の頻度であるようなマップに文字列を追加します(文字列が再び表示される場合は、値を増やします)。その後、キーと値のペアを上で提案したマップにコピーします。Map<String, Integer>

于 2012-08-02T14:52:03.353 に答える
0

よくわかりませんが、ニーズに最も適したエレガントなクラスはguavaの http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/TreeMultiset.htmlだと思います。

于 2012-08-02T14:59:32.187 に答える
0

これには Max Heap データ構造が必要です。すべてを最大ヒープに入れ、連続して 10 回 (または任意の n 回) の削除を行います。

また、メモリに読み込まれたデータを再利用し続けるつもりなら、ヒープではなく値でソートする価値があるかもしれません。

于 2012-08-03T17:01:04.617 に答える
0

Guava には、これに非常に役立つ HashMultiset があります。

HashMultiset<String> ms = Hashmultiset.create();
ms.add(astring);
ms.add(astring, times);


ImmutableMultiset<String> ims = Multisets.copyHighestCountFirst(ms);

// iterator through the first 10 elements, and they will be your top 10
// from highest to lowest.
于 2012-08-02T15:04:15.753 に答える
0

「上位 N 個のアイテムを見つける」などのタスクでは、優先度キューが最適なソリューションです。Java のPriorityQueueクラスを参照してください。

于 2012-08-02T14:52:00.743 に答える