我现在很困惑。我应该编写一个使用哈希表的程序。哈希表包含单词及其使用频率。“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 类:只需将 String 对象添加到 Bag 中,bag 就会自动为您记数。
无论如何,您被要求使用地图,而地图可让您通过使用键快速找到东西。键可以是任何对象,并且字符串非常常用:它们是不可变的,并且具有良好的 hashCode 和 equals 实现,这使其成为理想的键。
Map的javadoc讨论了如何使用地图。Hashtable 是这个接口的一种实现,虽然它不是一个特别好的实现。
您需要一个好的键来让您快速找到现有的 Word 对象,以便您可以递增计数器。虽然您可以将 Word 对象本身作为键,但您还需要做一些工作:最好使用 Word 包含的字符串作为键。
您可以通过查找以 String 作为其键的值对象来确定 Word 是否已在映射中。
你最好使用 Bag,它会记录每个元素的数量:
http://commons.apache.org/collections/api-release/org/apache/commons/collections/Bag.html
这段代码应该可以解决你的问题
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
s 数组,您可以使用以下方法完成类似的操作:
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;
}