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

Java实现文件字符去重并通过CharacterFrequency对象统计次数求助

问题分析与修复方案

我一眼就看出你这段代码的核心问题——你从头到尾只在使用同一个CharacterFrequency对象,这根本没法统计不同字符的出现次数!具体问题点:

  • 每次遇到新字符就直接覆盖当前对象的字符属性,之前统计的字符数据直接丢失
  • 循环里反复把同一个对象添加到charObjectsArray,最后数组里全是同一个对象的引用,只会记录最后一个字符的统计结果
  • 判断逻辑错误:你拿当前字符和随时被覆盖的newcharobj比较,完全没法追踪之前出现过的字符

正确实现思路

我们需要一个映射关系来绑定字符和对应的统计对象,推荐用HashMap<Character, CharacterFrequency>来存储:

  1. 遍历字符数组时,先检查Map中是否已有当前字符的CharacterFrequency对象
  2. 如果存在,直接调用该对象的increment()方法累加次数
  3. 如果不存在,新建对应字符的CharacterFrequency对象,存入Map的同时也添加到你的集合/数组中

修正后的代码

// create character array from string s
char[] charArray = s.toCharArray();
System.out.println(charArray);

// 用Map维护字符与统计对象的映射
Map<Character, CharacterFrequency> charFreqMap = new HashMap<>();
List<CharacterFrequency> charObjectsArray = new ArrayList<>(); // 假设你用List存储对象,数组逻辑类似

// iterate though character array
for (char c : charArray) {
    if (charFreqMap.containsKey(c)) {
        // 已有该字符的统计对象,直接累加次数
        charFreqMap.get(c).increment(1);
    } else {
        // 首次遇到该字符,新建统计对象
        CharacterFrequency newCharObj = new CharacterFrequency();
        newCharObj.setCharacter(c);
        newCharObj.increment(1); // 初始化次数为1,或者用setCount(1)(看你类的实现)
        // 存入Map和集合
        charFreqMap.put(c, newCharObj);
        charObjectsArray.add(newCharObj);
    }
}

额外说明

  • 后续要查看所有字符的统计结果,直接遍历charObjectsArray或者charFreqMap.values()即可
  • 既然你说CharacterFrequency类功能正常,那只要确保它的getCharacter()、increment()等方法逻辑正确就没问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:18:02