1

入力ファイルからデータを取得し、必要なものを取得してファイルに出力する単純なプロジェクトに取り組んでいます。基本的に単語の頻度を取得しているため、各キーは文字列であり、値はドキュメント内の頻度です。ただし、問題は、これらの値を頻度の高い順にファイルに出力する必要があることです。ハッシュマップを作成した後、これはプログラムの一部であり、それを並べ替えてファイルに書き込みます。

//Hashmap I create
Map<String, Integer> map = new ConcurrentHashMap<String, Integer>();
int valueMax = -1;
//function to sort hashmap
while (map.isEmpty() == false){
            for (Entry<String, Integer> entry: map.entrySet()){
                if (entry.getValue() > valueMax){
                    max = entry.getKey();
                    System.out.println("max: " + max);
                    valueMax = entry.getValue();
                    System.out.println("value: " + valueMax);
                }
            }
            map.remove(max);
            out.write(max + "\t" + valueMax + "\n");
            System.out.println(max + "\t" + valueMax);  
        }   

これを実行すると、次のようになります。

t 9
t 9
t 9
t 9
t 9
....

そのため、同じ値を取得し続けるため、削除機能が機能していないようです。スコープ ルールに問題があるか、ハッシュマップをよく理解していないだけだと思います。

ハッシュマップをソートして印刷するより良い方法を知っている人がいれば、提案を歓迎します。

ありがとう

4

5 に答える 5

2

while ループへの再入力時にリセットしないため、後続のすべての反復でentry.getValue() > valueMax決して true にならないため、コードは機能しません。valueMax

ただし、同時にアクセス可能なマップをダブルループする必要はありません。

ConcurrentSkipListMap最大のキーを返すlastKeyメソッドがあり、マップ全体の反復を必要としません。

于 2012-10-24T23:25:07.313 に答える
1

valueMaxコードから、ループの最後でリセットしていないようです。これは、ループの最初のラウンドで最大値を見つけることを意味しますが、全体の最大値と比較しているため、その後の値は決して見つかりません。

于 2012-10-24T23:27:31.617 に答える
1

ハッシュマップ: 順不同。List を実装する ArrayList を使用して順序を設定できます。

見てみましょう: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

于 2012-10-24T23:37:55.610 に答える
0

次のようなものはどうですか(テストされていません)

  final Map<String, Integer> map = new ConcurrentHashMap<String, Integer>();
  final Comparator <String, String> comparator = new Comparator ()
         {
             compare(String o1, String o2) 
             {
                  return map.get(o1) - map.get(o2);
             }
         };

  final TreeMap <String, Integer> sortedMap = new TreeMap (comparator);
  sortedMap.addAll(map);
  System.out.println(sortedMap);
于 2012-10-25T07:14:45.597 に答える
0

key > valueMax の初期値を持つエントリがマップにないためだと思います。そのため、条件if (entry.getValue() > valueMax)は決して真ではありません。

さらに、ソートされたコンテンツを保持するものがあるため、追加のロジックTreeMapなしで反復処理できます。entrySet()

于 2012-10-24T23:27:41.193 に答える