如何利用哈希表来保存单词和使用频率?

时间:2011-10-26 23:21:51

标签: java hashmap word hashtable word-frequency

我现在很困惑。我应该编写一个使用哈希表的程序。哈希表包含单词及其使用频率。 “Word”类包含一个计数器和字符串。如果该字已经在表中,则其频率增加。我一直在研究如何做到这一点,但我只是迷失了。我需要指出正确的方向。任何帮助都会很棒。

5 个答案:

答案 0 :(得分:3)

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));
    }
}

这样就可以了。

答案 1 :(得分:3)

Hashtable现在是任何新Java代码的不寻常选择。我认为这是一种练习。

我会稍微关注任何尚未更新以使用新机制的练习。

在任何单线程场景中,HashMap将为您提供比Hashtable更好的性能。

但正如Emmanuel Bourg points outBag将为您完成所有这些而不需要Word类:只需将String对象添加到Bag中,行李将自动为您计算

无论如何,您被要求使用地图,地图可让您使用密钥快速查找内容。键可以是任何Object,并且Strings是非常常用的:它们是不可变的并且具有hashCode和equals的良好实现,这使它们成为理想的键。

javadoc for Map讨论了如何使用地图。 Hashtable是这个界面的一个实现,虽然它不是特别好的。

您需要一个好的密钥才能让您快速找到现有的Word对象,以便您可以增加计数器。虽然您可以将Word对象本身放入键中,但您可能需要做一些工作:更好的方法是使用Word包含的字符串作为键。

通过查找以String为键的值对象,可以找到Word是否已经在地图中。

答案 2 :(得分:1)

你最好使用一个Bag,它会保留每个元素的数量:

http://commons.apache.org/collections/api-release/org/apache/commons/collections/Bag.html

答案 3 :(得分:1)

这段代码应该可以解决您的问题

  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);
  }

答案 4 :(得分: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;

}