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
相关产品推荐
相关产品推荐

