私は今とても混乱しています。ハッシュテーブルを使用するプログラムを作成することになっています。ハッシュテーブルには、使用頻度とともに単語が保持されます。クラス「Word」は、カウンターと文字列を保持します。単語が既に表にある場合、その頻度は増加します。私はこれを行う方法を研究してきましたが、迷っています。私は正しい方向に向けられる必要があります。どんな助けでも素晴らしいでしょう。
5 に答える
Hashtable<String, Word> words = new Hashtable<String, Word>();
public void addWord(String s) {
if (words.containsKey(s) {
words.get(s).plusOne();
} else {
words.put(s, new Word(s));
}
}
これでできます。
最近の新しい Java コードでは、Hashtable を選択することはあまりありません。これはある種の運動だと思います。
新しいメカニズムを使用するように更新されていない演習については、少し心配です。
HashMap は、シングル スレッドのシナリオで Hashtable よりも優れたパフォーマンスを提供します。
しかし、Emmanuel Bourgが指摘しているように、Bagは Word クラスをまったく必要とせずにこれらすべてを実行します。Bag に String オブジェクトを追加するだけで、Bag は自動的にカウントを維持します。
とにかく、マップを使用するように求められています。マップを使用すると、キーを使用してすばやく物事を見つけることができます。キーは任意のオブジェクトにすることができ、文字列は非常に一般的に使用されます。文字列は不変であり、hashCode と equals の優れた実装を備えているため、理想的なキーになります。
Mapのjavadoc では、マップの使用方法について説明しています。Hashtable はこのインターフェースの実装の 1 つですが、特に優れたものではありません。
カウンターをインクリメントできるように、既存の Word オブジェクトをすばやく見つけるには、適切なキーが必要です。Word オブジェクト自体をキーにすることもできますが、いくつかの作業が必要になります。Word に含まれる String をキーとして使用する方がよいでしょう。
文字列をキーとして持つ値オブジェクトを探すことで、Word が既にマップ内にあるかどうかを確認します。
このコードはあなたの問題を解決するはずです
Hashtable <String, Word> myWords = new Hashtable<String, Word>();
Word w = new Word("test");
Word w = new Word("anotherTest");
String inputWord = "test";
if (myWords.containsKey(inputWord)){
myWords.get(inputWord).setCounter(myWords.get(inputWord).getCounter+1);
}
クラスWord
にカウンターと文字列があるとすれば、HashMap<String, Word>
. 入力が の配列である場合String
、次を使用して次のようなことを実現できます。
public Map<String, Word> getWordCount(String[] input) {
Map<String, Word> output = new HashMap<String, Word>();
for (String s : input) {
Word w = output.get(s);
if (w == null) {
w = new Word(s, 0);
}
w.incrementValue(); // Or w = new Word(s, w.getCount() + 1) if you have no such function
output.put(s, w);
}
return output;
}
各要素の数を保持する Bag を使用することをお勧めします。
http://commons.apache.org/collections/api-release/org/apache/commons/collections/Bag.html