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

Java如何正确输出以字母a结尾的姓名并统计其占比

问题排查与修正方案

原代码存在的核心问题

  • 输入读取逻辑错位:初始化name变量时提前调用了一次sc.nextLine(),后续循环读取10个姓名存入数组时,实际需要用户输入11次内容,第一次读取的姓名没有存入数组,直接造成数据丢失。
  • 变量复用导致筛选逻辑失效:查找最长、最短姓名的过程中反复复用同一个name变量,两个长度判断循环执行完后,name已经被固定赋值为找到的最短姓名。后续筛选结尾为"a"的姓名时,循环里始终判断的是这个固定的最短姓名,根本没有遍历校验数组内的所有元素,筛选结果完全错误。
  • 缺失占比统计逻辑:没有对符合条件的姓名做计数,也没有对应百分比计算的代码。
  • 边界场景未覆盖:如果用户输入空字符串、姓名结尾为大写"A",原逻辑要么会抛出异常,要么会漏判符合条件的结果。
  • 之前用charAt方法实现失败,基本是索引取值错误:字符串最后一位的索引是字符串长度-1,误写为取length()位置的字符会直接触发索引越界异常。

修正后可运行代码

import java.util.Scanner;

public class NameFilter {
    public static void main(String[] args) {
        String[] array = new String[10];
        Scanner sc = new Scanner(System.in);

        System.out.println("ENTER THE NAMES");
        // 读取10个姓名存入数组,去掉提前读取的冗余逻辑
        for (int i = 0; i < array.length; i++) {
            array[i] = sc.nextLine();
        }

        // 单独定义变量存储最长、最短姓名,不干扰后续筛选逻辑
        String longestName = array[0];
        String shortestName = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i].length() > longestName.length()) {
                longestName = array[i];
            }
            if (array[i].length() < shortestName.length()) {
                shortestName = array[i];
            }
        }
        System.out.println("LONGEST NAME: " + longestName);
        System.out.println("SHORTEST NAME: " + shortestName);

        // 筛选以a结尾的姓名并统计数量
        int matchCount = 0;
        System.out.println("NAMES END WITH 'a':");
        for (int i = 0; i < array.length; i++) {
            String currentName = array[i];
            // 跳过空输入避免异常
            if (currentName == null || currentName.isEmpty()) {
                continue;
            }
            // 两种判断方式二选一即可,兼容大写A的话统一转小写再判断
            // 方式1:endsWith实现
            boolean endWithA = currentName.toLowerCase().endsWith("a");
            // 方式2:charAt实现(注意索引是length()-1,避免越界)
            // boolean endWithA = Character.toLowerCase(currentName.charAt(currentName.length() - 1)) == 'a';
            
            if (endWithA) {
                System.out.println(currentName);
                matchCount++;
            }
        }

        // 计算并输出占比,用100.0做运算避免整数除法结果为0
        double percentage = matchCount * 100.0 / array.length;
        System.out.printf("PERCENTAGE OF NAMES END WITH 'a': %.2f%%\n", percentage);
        
        sc.close();
    }
}

关键修正点说明

  • 输入逻辑调整为循环10次刚好读取10个姓名存入数组,移除冗余的提前读取操作。
  • 最长、最短姓名判断使用独立变量存储,不会和后续筛选逻辑的变量产生冲突。
  • 筛选逻辑遍历数组内每一个姓名做判断,而非固定判断单个变量值。
  • 补充空值校验,避免空输入触发运行时异常。
  • 兼容大小写判断,结尾为大写"A"的姓名也会被正常识别。
  • 增加计数变量统计符合条件的姓名数,通过浮点数运算计算占比,保留两位小数输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:12:20