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

Java项目求助:如何实现文本文件元音计数的表格输出

元音统计程序优化思路指引

需求说明

编程新手正在学习Java,课程项目要求实现:

  1. 读取文本文件内容
  2. 统计每个元音(A/E/I/O/U,不区分大小写)的出现次数
  3. 按以下格式输出统计结果:
A|##
E|##
I|####
O|#
U|

当前进度

已实现总元音数量统计(测试文本"orange tree apple hope"总元音数为9),也能输出固定#数量的表格,但无法将每个元音的实际统计数填入表格。预期各元音统计结果:a=2, e=5, i=0, o=2, u=0。

现有完整代码:

import java.util.Scanner ;
import java.io.File ;

public class VowelCounter
{
    public static void main(String[] args) throws Exception
    {
        File text = new File ("Doc.txt") ;
        Scanner input = new Scanner(text) ;
        //File Doc.txt is scanned and is used 
        int count = 0 ;

        while (input.hasNext())
        {
            String words = input.nextLine();
            System.out.println(words);

            for (int i=0;i<words.length(); i++)
            {
                char car = words.charAt(i);
                if (car =='a'|| car == 'i' || car == 'e' || car=='o' || car == 'u')
                {
                    count ++ ;
                }

                //Test Values (NOT FINAL)
                int a = 5 ;
                int e = 5;
                int ii = 5;
                int o = 5;
                int u = 5;
            }

            //Process for creating the chart (NOT FINAL)
            System.out.println(count);
            System.out.print("A|");
            final int MAX_ROWS = 1 ;
            for (int row = 1; row <= MAX_ROWS; row++)
            {
                for(int a =5; a >= row; a--)
                    System.out.print("#");
            }
            System.out.println("");
            System.out.print("E|");
            for (int row = 1; row <= MAX_ROWS; row++)
            {
                for(int e =5; e >= row; e--)
                    System.out.print("#");
            }
            System.out.println("");
            System.out.print("I|");
            for (int row = 1; row <= MAX_ROWS; row++)
            {
                for(int ii =5; ii >= row; ii--)
                    System.out.print("#");
            }
            System.out.println("");
            System.out.print("O|");
            for (int row = 1; row <= MAX_ROWS; row++)
            {
                for(int o =5; o >= row; o--)
                    System.out.print("#");
            }
            System.out.println("");
            System.out.print("U|");
            for (int row = 1; row <= MAX_ROWS; row++)
            {
                for(int u =5; u >= row; u--)
                    System.out.print("#");
            }
        }
        //(ERROR) prints 15 # instead of 4
        // a= 2 e=5 i=0 o=2 u=0 (FOR CHECK)
        // 9 toatl vowels
    }
}

优化思路指引

  • 调整计数器作用域:你现在的单个元音计数器(a/e/ii/o/u)定义在字符遍历循环内部,每次循环都会重置为5,完全无法保存统计结果。需要把这些计数器移到while循环外面,初始值设为0,这样整个统计过程中数值能持续累加。
  • 拆分统计逻辑:把原来只累加总元音数的代码,改成判断每个字符对应的元音,给对应计数器加1。比如遇到'a'就给a计数器加1,遇到'e'就给e计数器加1,以此类推。如果要兼容大写元音,可以先把字符转成小写(用Character.toLowerCase(car))再判断。
  • 替换表格的固定值:输出表格时,原来用固定值5来循环输出#,现在要替换成对应元音的计数器数值。比如输出A行时,循环次数等于a计数器的值,这样就能输出对应数量的#。另外你写的嵌套循环(row和计数的循环)可以简化,直接写一个从1到计数器值的循环,每次输出一个#即可。
  • 修正表格输出位置:当前代码每读取一行就输出一次表格,会导致重复输出。应该把表格输出代码移到while循环结束之后,等所有文本行都统计完成,再输出最终的统计表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:35:21