如何检查哈希表是否包含特定键?

How to check if Hashtable contains specific key?

我有一个 ArrayList<String> 和一个 Hashtable<String, Double>。因此,当我将 arraylist 与 hash table 进行比较时,如果找到键(字符串),我想获取值(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 - 每次 map.

中不存在密钥时,它都会使分数为零

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

第二个问题是您正在使用 contains, which checks for a value being present, instead of containsKey,它会检查是否存在密钥。

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

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

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

你的代码有两个问题:

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

如果下面的方法不起作用

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 以确保字符串的大小写相同或者它们甚至存在。并确保您将 "word" 与 "word" 进行比较并且没有多余的白色 space。因此,您可能需要从值中 trim 白色 space。并像上面一样放入一些调试语句。