我遇到了这个问题:我要编写一个方法contains3,它接受一个字符串List作为参数,如果列表中至少有3个字符串出现,则返回true,否则返回false。我需要使用地图。
当一个单词有三个实例时,它仍然不会返回true;我无法找到出错的地方。
这就是我所拥有的:
private static boolean contains3(List<String> thing) {
Map<String, Integer> wordCount = new TreeMap<String, Integer>();
for (String s: thing) {
String word = s;
if (wordCount.containsKey(word)) { // seen before.
int count = wordCount.get(word);
wordCount.put(word, count + 1);
} else {
wordCount.put(word, 1); // never seen before.
}
if (wordCount.containsValue(3)) {
return true;
} else {
return false;
}
}
return false;
}
答案 0 :(得分:3)
问题在于:
if (wordCount.containsValue(3)) {
//...
您应该使用密钥获取值,换句话说,您计算的是word
。
if (wordCount.get(word) >= 3) {
return true;
}
请注意,我从return false;
语句中删除了if
,因为它会在第一次迭代中破坏该方法。
作为建议,您可以使用HashMap
代替TreeMap
来增强您的方法的效果,因为put
和get
HashMap
中的时间是O(1)(常数时间),而TreeMap
是O(log n)。
答案 1 :(得分:2)
尝试使用以下代码。
private static boolean contains3(List<String> thing) {
Map<String, Integer> wordCount = new TreeMap<String, Integer>();
thing.add("hi");
thing.add("hi");
thing.add("hi");
thing.add("hia");
thing.add("hi3");
for (String s: thing) {
String word = s;
if (wordCount.containsKey(word)) { // seen before.
int count = wordCount.get(word);
wordCount.put(word, count + 1);
} else {
wordCount.put(word, 1); // never seen before.
}
}
if (wordCount.containsValue(3)) {
return true;
} else {
return false;}
答案 2 :(得分:1)
您在添加每个单词时运行此代码:
if (wordCount.containsValue(3)) {
return true;
} else {
return false;
添加第一个单词后测试将失败,您将立即返回false
。将该块移动到方法的末尾,在当前有return false
的最后一行,只在您计算所有单词时进行检查。
答案 3 :(得分:1)
把
if (wordCount.containsValue(3)) {
return true;
} else {
return false;
}
在for循环之外的
答案 4 :(得分:0)
在初始if块
中检查count是否>> 3更有效 if (wordCount.containsKey(word)) { // seen before.
int count = wordCount.get(word) + 1;
if(count >= 3) {
return true;
}
wordCount.put(word, count);
}
并删除以下if else块
if (wordCount.containsValue(3)) {
return true;
} else {
return false;
}