2

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

4

5 回答 5

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

这会做到的。

于 2011-10-26T23:27:32.097 回答
3

如今,对于任何新的 Java 代码来说,Hashtable 都是一个不寻常的选择。我认为这是某种锻炼。

对于任何尚未更新为使用更新机制的练习,我都会略微担心。

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

但正如 Emmanuel Bourg指出的那样Bag会为您完成所有这些工作,而根本不需要 Word 类:只需将 String 对象添加到 Bag 中,bag 就会自动为您记数。

无论如何,您被要求使用地图,而地图可让您通过使用键快速找到东西。键可以是任何对象,并且字符串非常常用:它们是不可变的,并且具有良好的 hashCode 和 equals 实现,这使其成为理想的键。

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

您需要一个好的键来让您快速找到现有的 Word 对象,以便您可以递增计数器。虽然您可以将 Word 对象本身作为键,但您还需要做一些工作:最好使用 Word 包含的字符串作为键。

您可以通过查找以 String 作为其键的值对象来确定 Word 是否已在映射中。

于 2011-10-26T23:36:46.630 回答
1

你最好使用 Bag,它会记录每个元素的数量:

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

于 2011-10-26T23:26:07.657 回答
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);
  }
于 2011-10-26T23:27:58.180 回答
1

鉴于该类Word有一个计数器和一个字符串,我会使用HashMap<String, Word>. 如果您的输入是一个Strings 数组,您可以使用以下方法完成类似的操作:

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;

}

于 2011-10-26T23:28:49.907 回答