如何在JTextArea中统计字符串各字符出现次数并打印输出
问题排查与修复方案
现有代码的核心问题
- 计数数组未实际赋值:你声明了
counted数组存储字符出现次数,但全程没有给数组元素赋值,输出的永远是初始值0 - 输出内容被反复覆盖:你在内层循环中每次都调用
setText(),该方法会直接清空文本框原有内容,最终只能保留最后一次循环设置的内容 - 统计逻辑冗余错误:双重循环+额外的
cat字符数组、find变量完全没有必要,统计逻辑混乱,没有先完成全量统计再输出
修正后的代码
btnStat.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String text = textbox1.getText(); // 建议MAX_CHAR定义为65536,覆盖所有Unicode字符,适配中文等非ASCII字符统计 int counted[] = new int[MAX_CHAR]; int length = text.length(); // 第一步:遍历所有字符完成次数统计 for (int i = 0; i < length; i++) { char currentChar = text.charAt(i); counted[currentChar]++; } // 第二步:拼接统计结果,避免重复输出相同字符 StringBuilder resultBuilder = new StringBuilder("Character Frequency: \n"); boolean[] alreadyOutput = new boolean[MAX_CHAR]; for (int i = 0; i < length; i++) { char currentChar = text.charAt(i); if (!alreadyOutput[currentChar]) { resultBuilder.append("'").append(currentChar).append("' - ").append(counted[currentChar]).append(" ,\n"); alreadyOutput[currentChar] = true; } } // 第三步:一次性将完整结果写入目标文本框 textbox6.setText(resultBuilder.toString()); } });
额外优化建议
- 如果文本框展示时换行失效,确认textbox6已经开启多行展示属性
- 如果需要忽略大小写、过滤空格/特殊字符,可在统计步骤增加对应的判断逻辑
- 如果只需要统计ASCII字符,
MAX_CHAR设置为256即可,需要统计全字符则设置为65536
内容的提问来源于stack exchange,提问作者blkpanda
相关产品推荐
相关产品推荐

