检测列表中的多个值

时间:2013-10-12 05:12:35

标签: java list map

我遇到了这个问题:我要编写一个方法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;
}

5 个答案:

答案 0 :(得分:3)

问题在于:

if (wordCount.containsValue(3)) {
    //...

您应该使用密钥获取值,换句话说,您计算的是word

if (wordCount.get(word) >= 3) {
    return true;
}

请注意,我从return false;语句中删除了if,因为它会在第一次迭代中破坏该方法。


作为建议,您可以使用HashMap代替TreeMap增强您的方法的效果,因为putget 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;
    }