如何检查哈希表是否包含特定键?
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);
}
你的代码有两个问题:
- 使用
contains
代替 containsKey
。
- 只要找不到指定的键,
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。并像上面一样放入一些调试语句。
我有一个 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);
}
你的代码有两个问题:
- 使用
contains
代替containsKey
。 - 只要找不到指定的键,
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。并像上面一样放入一些调试语句。