检查哈希映射和迭代哈希映射中的键之间的区别

时间:2014-02-27 09:10:31

标签: java hash hashmap

我有一个单词列表,每个单词都有相应的分数。我正在梳理并匹配.txt文件中的大块文本中的每个单词和单词列表中的单词。 .txt文件最多可包含10,000行文本。

当我第一次这样做时,我使用了一种非常强力和天真的方法来匹配我的单词列表中的单词与我的.txt文件。虽然我使用了哈希映射,但我没有正确使用哈希映射,并且可能也将它用作列表。所以代码是用以下方式编写的:

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

单词是一个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()方法。

然而,第二种有效的方法并没有产生我想要的结果。

我不太确定为什么单词的匹配方式不同。从我所看到的,他们都应该提供完全相同的答案,除了我的后一个代码应该更快。相反,迭代哈希映射的所有键的第一种方法实际上产生了我想要的结果(我手动检查了这个),而第二种方法没有。

我的哈希映射中没有空值,我已经测试过了。我已经查找了哈希映射的实现,所以我不太明白为什么这不起作用。我在这里遗漏了什么,或者是否有其他不相关的因素影响了我的结果?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果我理解正确words[i]String。在第一个解决方案中,您将匹配具有映射键的每个单词作为子字符串。第二种情况是完全匹配。

这一个:

words[i].contains(entry.getKey())

将匹配具有entry.getKey() ssubstring的每个单词。即它将匹配字符alabala

ala

在这里:

(val = hmap.get(words[k])) != null

写得更好:

hmap.contains(words[k])

检查地图是否包含与给定单词完全匹配的键。在这种情况下,ala与单词alabala不匹配。

答案 1 :(得分:1)

你使用的两个条件不会测试同一个东西。让我们举个例子words[i]被“测试”,你的地图包含关键词“test”:

if(words[i].contains(entry.getKey())) {

此条件检查您的Word [i] 是否包含您的地图密钥,这意味着将评估if块。

if((val = hmap.get(words[k])) != null){

此条件检查您的地图是否包含字符串字[k](“已测试”),由于其仅包含“test”,因此将评估为false。

我相信对于您的用例,第二个实现会给出您正在寻找的结果。