【发布时间】:2014-02-27 09:10:30
【问题描述】:
我有一个单词列表,每个单词都有相应的分数。我正在梳理和匹配 .txt 文件中一大块文本中的每个单词与单词列表中的单词。 .txt 文件最多可包含 10,000 行文本。
当我第一次这样做时,我使用了一种非常暴力和幼稚的方法来匹配我的单词列表中的单词和我的 .txt 文件。虽然我使用了hash map,但是我没有正确使用hash map,还不如把它当成一个list来用了。所以代码是这样写的:
for(int i=0; i<words.length; i++){
for(int j=0; j<wordListType.size(); j++){
Map<String, Integer> hmap = wordListType.get(j).getMap();
for(Map.Entry<String, Integer> entry : hmap.entrySet()){
if(words[i].contains(entry.getKey())){
foo();
}
}
}
}
words 是一个 String[] ,其中包含文本文件中的单个单词。 wordListType 是一个类的 ArrayList,其中包含我正在搜索的关键字的哈希映射。它是一个 ArrayList,因为有多种类型的单词列表。 getMap() 是我自己在 WordList 类中的辅助方法。
之后,我发现我的代码效率低下,而且我没有充分利用我的哈希映射。于是我把代码改成如下:
for(int i=0; i<words.length; i++){
for(int j=0; j<wordListType.size(); j++){
Map<String, Integer> hmap = wordListType.get(j).getMap();
Integer val = null;
if((val = hmap.get(words[i])) != null){
foo();
}
}
}
这样我不会像第一种方法那样遍历 hmap 中的每个键,而是使用 O(1) HashMap.get() 方法。
但是,第二种有效的方法并没有产生我想要的结果。
我不太清楚为什么这些词的匹配方式不同。据我所见,它们都应该提供完全相同的答案,除了我后面的代码应该做得更快。相反,第一种迭代哈希映射的所有键的方法实际上是产生我想要的结果(我手动检查了这个),而第二种方法没有。
我已经测试过的哈希图中没有空值。我已经查看了哈希映射的实现,所以我不太明白为什么这不起作用。我在这里遗漏了什么,还是有其他不相关的东西影响了我的结果?非常感谢任何帮助。
【问题讨论】:
-
你在哪里设置索引变量
k(在hmap.get(words[k])?不应该是i吗?是错字吗? -
是的,我的实际代码略有不同,所以我在提供示例时忘记更改它。谢谢你指出这一点。编辑了我原来的帖子。