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
相关产品推荐
相关产品推荐

