Java程序误将英文句号(.)统计为字母字符的问题求助
解决你的字母统计程序排除句号问题
嘿,我瞅了下你的代码,问题出在输出循环里的判断条件上,咱们来一步步修正它!
核心问题分析
你写的判断条件 if(ltrCtr[i] >= 1 && (int)ltrCtr[i] != 46) 逻辑完全错了:
ltrCtr[i]是该字符的出现次数,不是字符的ASCII值- 46是英文句号的ASCII码,对应的是循环变量
i(因为i遍历的是ASCII索引),所以你应该判断的是i != 46,但更合理的是直接筛选字母字符,这样能一次性排除所有非字母符号(不止句号)。
另外,你已经用ctr统计了所有字母的总次数来计算频率,那输出的时候只需要保留字母字符就好,这样更贴合你的需求。
修改后的代码
import java.io.File; import java.io.FileNotFoundException; import java.text.DecimalFormat; import java.util.Scanner; public class CountOccurences { private static Scanner input; public static void main(String [] args) throws FileNotFoundException { DecimalFormat dec = new DecimalFormat("#.000"); input = new Scanner(new File("story.txt")); int[] ltrCtr = new int[127]; // 统计ASCII表中每个字符的出现次数 // 优化:用StringBuilder代替字符串拼接,效率更高 StringBuilder strBuilder = new StringBuilder(); while(input.hasNext()) { strBuilder.append(input.next()); } char[] text = strBuilder.toString().toCharArray(); int totalLetters = 0; // 重命名变量,更清晰 for(int i = 0; i < text.length; i++) { char temp = text[i]; int asciiValue = (int)temp; ltrCtr[asciiValue]++; if(Character.isAlphabetic(temp)) { totalLetters++; } } System.out.println("Letter | Amount | Freq"); System.out.println("------------------------"); for(int i = 0; i < ltrCtr.length; i++) { // 关键修改:只统计出现过的字母字符 if(ltrCtr[i] >= 1 && Character.isAlphabetic(i)) { System.out.printf(" %c | %d | %s%%%n", (char)i, ltrCtr[i], dec.format((double)ltrCtr[i]/totalLetters)); } } input.close(); } }
关键修改点
- 替换字符串拼接方式:用
StringBuilder代替str += input.next(),避免频繁创建字符串对象,提升大文件处理效率。 - 修正输出判断条件:用
Character.isAlphabetic(i)来筛选字母字符,彻底排除所有非字母符号(包括句号、逗号等),比单独判断句号更通用。 - 变量重命名:把
ctr改成totalLetters,代码可读性更强。 - 优化输出格式:用
printf让输出更整齐美观。
这样修改后,程序就只会统计并输出字母字符的出现次数和频率,不会再包含句号啦!
内容的提问来源于stack exchange,提问作者Nudd3
相关产品推荐
相关产品推荐

