java - 检查 HashMap 和遍历 HashMap 中的键之间的区别

标签 java hash hashmap

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

当我第一次这样做时,我使用了一种非常暴力和幼稚的方法来将我的单词列表中的单词与我的 .txt 文件进行匹配。虽然我使用了 HashMap ,但是我没有正确使用 HashMap ,还不如把它当作列表来使用。所以代码是这样写的:

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,其中包含我正在搜索的关键字的 HashMap 。它是一个ArrayList,因为有多种类型的单词列表。 getMap() 是我自己在 WordList 类中的辅助方法。

后来,我发现我的代码效率低下,而且我没有充分利用我的 HashMap 。所以我将代码更改为以下内容:

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() 方法。

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

我不太清楚为什么这些词的匹配方式不同。从我所看到的来看,它们应该提供完全相同的答案,除了我后面的代码应该执行得更快。相反,迭代 HashMap 的所有键的第一种方法实际上产生了我想要的结果(并且我手动检查了这一点),而第二种方法则没有。

我的 HashMap 中没有空值,我已经对此进行了测试。我查了一下 HashMap 的实现,所以我不太明白为什么这不起作用。我在这里遗漏了一些东西还是有其他不相关的东西影响了我的结果?非常感谢任何帮助。

最佳答案

您使用的两个 if 条件不会测试同一件事。让我们举一个例子,其中 words[i] 已“tested”并且您的 map 包含键“test”:

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

此条件检查您的 Word[i] 包含您的 map 键,这意味着将评估 if block 。

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

此条件检查您的 map 是否包含字符串 word[k](“tested”),该字符串的计算结果为 false,因为它仅包含“test”。

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

关于java - 检查 HashMap 和遍历 HashMap 中的键之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22063820/

相关文章:

c++ - 在 C++ 中使用 unordered_set 作为 unordered_map 的键时出现的问题

c - 使用 void 指针的值作为哈希表中的键

java - 泛型映射 - 避免大量强制转换

接口(interface)/抽象类之间的Java关系

java - 当用户输入非 double 值时如何打印错误消息?

java - TimerTask 无法更新 JavaFX 标签文本

java - hashmap和多个txt文件java

java - 如何使用 JFreeChart 自定义 XYLineChart

ruby - 如何更改哈希值?

java - Hashmap的getValue返回Object