Java实现文件字符去重并通过CharacterFrequency对象统计次数求助
问题分析与修复方案
我一眼就看出你这段代码的核心问题——你从头到尾只在使用同一个CharacterFrequency对象,这根本没法统计不同字符的出现次数!具体问题点:
- 每次遇到新字符就直接覆盖当前对象的字符属性,之前统计的字符数据直接丢失
- 循环里反复把同一个对象添加到
charObjectsArray,最后数组里全是同一个对象的引用,只会记录最后一个字符的统计结果 - 判断逻辑错误:你拿当前字符和随时被覆盖的
newcharobj比较,完全没法追踪之前出现过的字符
正确实现思路
我们需要一个映射关系来绑定字符和对应的统计对象,推荐用HashMap<Character, CharacterFrequency>来存储:
- 遍历字符数组时,先检查Map中是否已有当前字符的
CharacterFrequency对象 - 如果存在,直接调用该对象的
increment()方法累加次数 - 如果不存在,新建对应字符的
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
相关产品推荐
相关产品推荐

