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

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(); 
    } 
}

关键修改点

  1. 替换字符串拼接方式:用StringBuilder代替str += input.next(),避免频繁创建字符串对象,提升大文件处理效率。
  2. 修正输出判断条件:用Character.isAlphabetic(i)来筛选字母字符,彻底排除所有非字母符号(包括句号、逗号等),比单独判断句号更通用。
  3. 变量重命名:把ctr改成totalLetters,代码可读性更强。
  4. 优化输出格式:用printf让输出更整齐美观。

这样修改后,程序就只会统计并输出字母字符的出现次数和频率,不会再包含句号啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:34