2012-04-22 11 views
2

私は単語の周波数Map<String, Integer>の地図を持っています。私は、出現頻度の低い単語のセットを作る必要があります。最も低い出現単語がすべて2回出現したとしましょう。これらの2回の出現単語のセットを作成する必要があります。これまでのところ、私は持っています:地図の最小値を持つキーをセットに移す

public Set findRarest() 
{ 
    int occurrence = 1000; //high initial value for word length 
    for (Map.Entry<String,Integer> item : wcMap.entrySet()) 
    { 
     if (item.getValue() > occurrence);  //most likely for performance 
     else if (item.getValue() == occurrence) 
     { 
      rarest.add(item.getKey()); 
     } 
     else          //found new lowest count 
     { 
      rarest.clear(); 
      rarest.add(item.getKey()); 
     } 
    } 
    return rarest; 
} 

これは私にちょっと混乱しているようです。これを行うためのネイティブコレクションツールはありますか?

+0

そうでもありません。グアバの 'Multiset'は多少厄介なものにするかもしれませんが、これは基本的にそれを行う方法です - ' if(item.getValue()>オカレンス); '行を持つ理由はまったくありません。 –

答えて

1

あなたのコードは書かれているように動作するとは思わない。二つのこと:

  1. 初期occurrenceInteger.MAX_VALUEだけではなく、いくつかの任意の値が大きいです。

  2. 頻度が低い単語が見つかるたびにoccurrenceの値を更新します。

それ以外の解決策は問題ありません。 Java Collections Frameworkクラスに自分自身を制限するクリーナーを手に入れることができるかどうかはわかりません。

更新コード:

public Set findRarest() 
{ 
    Set<String> rarest = new HashSet<String>(); 

    int occurrence = Integer.MAX_VALUE; //high initial value for word length 
    for (Map.Entry<String,Integer> item : wcMap.entrySet()) 
    { 
     if (item.getValue() == occurrence) 
     { 
      rarest.add(item.getKey()); 
     } 
     else if (item.getValue() < occurrence) 
     { 
      occurrence = item.getValue(); 
      rarest.clear(); 
      rarest.add(item.getKey()); 
     } 
    } 
    return rarest; 
} 
+0

ありがとうございます。私はその出来事の更新を見逃した。 Integer.MAX_VALUEも良い考えです。私は最初の "if"を使ってパフォーマンスを向上させました。短い言葉に遭遇すると、ほとんどの場合1つの評価しか行いませんでした。あなたのソリューションは、ほとんどの場合2つの評価を行います。私は何かを見逃しているかもしれない。 – Bol

+0

@LouisWassermanは彼のコメントで述べているように、ほとんどの場合、そのレベルで最適化する時間を無駄にしています。 * javacコンパイラ*と[jitコンパイラ](http://en.wikipedia.org/wiki/Just-in-time_compilation)は、こうした種類の最適化を行う上で本当にうまくいきます。私はあなたが実際にいくつかのタイミングテストを行ったとしたら、違いが出ないと思うでしょう。 – ulmangt

+0

それは本当に知って良いです。ありがとう。 – Bol

関連する問題