-1

単語と、特定のテキスト ファイルの各単語のカウントを含むこの HashMap があります。

{単語 = 1、単語 2 = 1、単語 3 = 2、単語 4 = 1、単語 5 = 1、単語 6 = 4、単語 7 = 1、単語 8 = 1};

私は他のトピックであなたの提案に従っていました。しかし、並べ替えられたコレクションの例を使用し、この場合は 1 になる可能性のある特定の KEY を検索すると、1 つの単語しか返されず、代わりに同じキーに対してより多くの値を返すことができることに気付きました。

ポイントはすべてのコレクションの間にあります。

リスト マップ ArrayLists ツリー HashMaps HashTables

どれを使用するのが最もお勧めですか?

私のクラスでは、ユーザーは int を入力し、その int は 1 番目、2 番目、3 番目、4 番目などに対応します。ファイルで使用される単語は、カウントと発生に基づいています。

それは挑戦的です

これまでのところ、ハッシュマップに保存し、最終的にはツリーで降順キーで注文することができました。したがって、最初の要素が大きくなります。しかし、アルゴリズムにはもっと意味が必要です。

ps。私は解決策やコードの一部を期待していませんが、開始するための適切な入力...従うのが最善の非常に良いアドバイスまたは指示です。

4

2 に答える 2

0

私があなたを正しく理解していれば、Map<String,Integer> map;単語をその頻度にマップする があり、単語を頻度で検索したいと考えています。

新しいマップを作成Map<Integer,List<String>>し、最初のマップを使用して塗りつぶします。

Map<Integer,List<String>> reverseMap = new HashMap<>();
for (Map.Entry<String,Integer> entry : map.entrySet()) {
    List<String> list = reverseMap.get(entry.getValue());
    if (list == null) {
        reverseMap.put(entry.getValue(), list = new ArrayList<>());
    }
    list.add(entry.getKey());
}

次のようなマップが得られます。

java.util.HashMap[3] {
    1=[word2, word4, word, word5, word7, word8]
    2=[word3]
    4=[word6]
}

このマップでは、各キーは頻度であり、各値はその頻度を持つ単語のリストです。

編集:2番目に使用頻度の高い単語(「ランク2」)を引き出すには、最も使用頻度の高いリストを生成します。

List<Integer> frequencies = new ArrayList<>(reverseMap.keySet());
Collections.sort(frequencies, Collections.reverseOrder());

それで:

System.out.println(reverseMap.get(frequences.get(2 - 1)));

または、マップ全体を頻度 (4、2、1) の降順で並べ替えるには、reverseOrder コンパレータを使用して、HashMap ではなく TreeMap として宣言します。

Map<Integer,List<String>> reverseMap = new TreeMap<>(Collections.reverseOrder());
于 2013-12-29T03:43:07.690 に答える
0

マップは、本質的に、キーごとに 1 つの要素のみを格納 (返す) します。つまり[key:1, val:a]、保存してから再度保存する場合です[key:1, val:2]。2 番目の挿入は最初の挿入をオーバーライドし、「取得」するとkey:1、返される結果は になりますb

ただし、キーごとにリストを格納することはできます。このリストには、同じキーごとにすべての値を格納できます。したがって、使用するマップを次のように宣言します。

Map<String, LinkedList<String>> map = new HashMap<>();

挿入は次のようになります。

public void insert(String key, String value){
    List<String> values = map.get(key);
    if (values == null){ // this is the first time we use this key
        values = new LinkedList<String>(); // so we need to create a new values List
    }
    values.add(value);
    map.put(key, values)
}

「取得」は非常に簡単です。
値のリストを取得し、それがnullでない場合は、値を繰り返して、必要に応じて印刷/実行します。

public List<String> get(String key){
    return map.get(key);
}
于 2013-12-29T03:38:36.760 に答える