You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TreeMap出现重复键且词频统计异常问题求助

看起来你的单词统计代码遇到了重复键的问题,而且逻辑上还有可以优化的地方。我来帮你拆解一下问题,然后给出修正后的代码。

首先,先分析你当前代码的几个核心问题:

  • 冗余且易出错的key集合:你代码里用到的key集合没有明确的定义,但如果它不是m.keySet()的实时视图,那么当你向m中添加新键后,key集合不会同步更新,导致无法正确检测到已存在的单词,进而出现逻辑错误。
  • 低效的嵌套循环:每次遍历整个key集合来检查单词是否存在,时间复杂度是O(n²),对于较大的单词列表来说会很慢。
  • 不必要的check变量:其实可以直接通过TreeMap的内置方法来判断键是否存在,不需要额外的标记变量。

接下来是修正后的代码,这里提供两种方案:

方案一:基础版(兼容所有Java版本)

public void analysiere() {
    for (String word : f) {
        // 先避免空字符串导致的索引越界异常
        if (word.isEmpty()) {
            continue;
        }
        // 检查单词首字符是否为字母
        if (Character.isAlphabetic(word.charAt(0))) {
            if (m.containsKey(word)) {
                // 单词已存在,计数+1
                m.put(word, m.get(word) + 1);
            } else {
                // 单词不存在,初始化为1
                m.put(word, 1);
            }
        }
    }
}

方案二:简洁版(Java 8+)

利用getOrDefault方法可以让代码更简洁,一行搞定计数更新:

public void analysiere() {
    for (String word : f) {
        if (!word.isEmpty() && Character.isAlphabetic(word.charAt(0))) {
            // 存在则取当前值+1,不存在则用0+1=1初始化
            m.put(word, m.getOrDefault(word, 0) + 1);
        }
    }
}

关于你提到的"重复Er键"问题

TreeMap本身是不允许重复键的,所以你看到的"两个Er"大概率是字符串看起来相同但实际不同:

  • 比如大小写差异:Er和ER被当成不同键
  • 或者带有不可见字符:比如Er和Er (末尾有空格)、Er\u00A0(非打印空格)

如果是大小写问题,你可以统一标准化单词格式,比如全部转小写:

public void analysiere() {
    for (String word : f) {
        if (!word.isEmpty() && Character.isAlphabetic(word.charAt(0))) {
            String normalizedWord = word.toLowerCase();
            m.put(normalizedWord, m.getOrDefault(normalizedWord, 0) + 1);
        }
    }
}

这样就能把Er、ER、er都合并成同一个键统计啦。

内容的提问来源于stack exchange,提问作者DiesDasAlex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:20:47