【问题标题】:How to check if Hashtable contains specific key?如何检查 Hashtable 是否包含特定键?
【发布时间】:2020-05-20 15:10:28
【问题描述】:

我有一个ArrayList<String> 和一个Hashtable<String, Double>。因此,当我将 arraylist 与哈希表进行比较时,如果找到 key(string),我想获取 value(double) 并在比较所有 arraylist 时找到最后的总值。但它总是给分数 0。

有代码

ArrayList<String> Trigram = Trigrams.GenerateTrigrams(extra, 3);

// System.out.print(Trigram);
Hashtable<String, Double> map = readModleFile("Models//EnglishModel.txt");

double score = 0;

for (String temKey : Trigram) {
  if (map.contains(temKey)) {
    Double value = map.get(temKey);
    score = score + value;
  } else {
    score = 0;

  }

}
System.out.print(score);

【问题讨论】:

  • 删除else
  • 只是一个建议-我认为您的循环可以简化为for (String temKey : trigram) if (map.contains(temKey)) score += map.get(temKey);
  • 它仍然只打印出 0.0
  • double score = Trigram.stream().filter(map::contains).mapToDouble(map::get).reduce(Double::sum).orElse(0);

标签: java hashtable


【解决方案1】:

您的else 分支总是将分数重置为 0;除非地图包含列表的所有元素,否则分数将始终至少重置一次。只需删除分支。

第二个问题是您使用contains,它检查是否存在值,而不是containsKey,它检查是否存在键。

for (String temKey : Trigram) {
  if (map.containsKey(temKey)) {
    Double value = map.get(temKey);
    score = score + value;
  }
}

还可以使用getOrDefault 缩短代码并使其更简洁,如果没有与键关联的映射,它将返回与键关联的映射或第二个参数(默认值)。

for (String temKey : Trigram) {
  score += map.getOrDefault(temKey, 0);
}

【讨论】:

  • 它仍然只打印出 0.0
  • @cloud123 您能否提供一个可重现的问题示例?
  • @cloud123 我已经编辑了我的答案。看看它现在是否有效。
  • @cloud123 请重新阅读我修改后的答案。您应该使用map.containsKey 而不是map.contains
  • @cloud123 由于您是此站点的新手,您可能不知道“接受答案”是什么意思。这是一些快速指南:"How does accepting an answer work?"
【解决方案2】:

你的代码有两个问题:

  1. 使用contains 代替containsKey
  2. 只要找不到指定的密钥,else 块就会将 score 重置为 0。删除 else 块。

您还可以按如下方式简化代码:

以下4行

if (map.containsKey(temKey)) {
    Double value = map.get(temKey);
    score = score + value;
}

只能用一行替换

score += map.getOrDefault(temKey, 0);

【讨论】:

  • 我的分数再次打印为 0。
  • if (map.contains(temKey)) { system.out.print(temKey) } 这甚至不打印 temKey?
  • 这也是我的猜测,即mapTrigram 中没有任何键。如果您知道如何在 IDE 中使用调试器,您将更容易找到问题所在。如果您不知道如何使用它,我强烈建议您尽快学习它。现在,只需打印ListMapSystem.out.println(Trigram);System.out.println(map); 即可找到问题所在。
【解决方案3】:

删除else - 每次在map 中不存在密钥时,它都会使分数为零。

【讨论】:

  • 它仍然只打印出 0.0
【解决方案4】:

如果以下不起作用

System.out.println(map);     // debug statement
for (String temKey : Trigram) {
  System.out.println("temKey = " + "\"" + temKey + "\""); // debug statement
  if (map.containsKey(temKey)) {
    Double value = map.get(temKey);
    score = score + value;
  } 
}

然后检查Trigram 列表和HashTable 以确保字符串的大小写相同或它们甚至存在。并确保您将“单词”与“单词”进行比较,并且没有多余的空白。因此,您可能需要从值中修剪空白。并像上面那样放入一些调试语句。

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2015-05-15
    • 2015-06-24
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多