如何让for循环中指定if语句仅执行首次迭代并修正首字母提取程序?
解决for循环首次迭代执行指定逻辑的问题及单词首字母提取修复
核心需求实现
你要的「for循环第一次迭代执行指定if语句,后续迭代忽略」的逻辑,不需要用continue或break——直接用i == 0作为判断条件就可以实现,你原来的第一个if其实已经符合这个逻辑,问题出在后续的首字母提取代码有错误,才导致了异常输出。
现有代码的关键错误
- 提取空格后首字母时,错误地把空格字符(
S.charAt(i))添加到结果里,而不是空格后面的字母(S.charAt(i+1))。 - 没有判断
i+1是否超出字符串长度,当输入句子以空格结尾时,会抛出StringIndexOutOfBoundsException。 - 未处理连续空格的情况,多个空格会导致重复添加无效内容。
修复后的完整代码
import java.util.Scanner; class First_letter { public static void main(String[] args) { // 通用清屏方式(替代\f,适配更多终端) System.out.print("\033[H\033[2J"); System.out.flush(); Scanner sc = new Scanner(System.in); System.out.println("请输入一个句子"); String s = sc.nextLine(); String upperCaseStr = s.toUpperCase(); // 用StringBuilder提升字符串拼接效率 StringBuilder result = new StringBuilder(); for (int i = 0; i < upperCaseStr.length(); i++) { // 仅首次迭代执行:如果第一个字符是字母,添加到结果 if (i == 0 && Character.isLetter(upperCaseStr.charAt(i))) { result.append(upperCaseStr.charAt(i)); } // 遇到空格时,提取后续的首字母 if (upperCaseStr.charAt(i) == ' ') { // 先确保下标不越界,再判断是否为字母 if (i + 1 < upperCaseStr.length() && Character.isLetter(upperCaseStr.charAt(i + 1))) { result.append(upperCaseStr.charAt(i + 1)); // 跳过已处理的字母,避免重复遍历 i++; } } } System.out.println("由句子中所有单词首字母组成的单词是: " + result.toString()); sc.close(); } }
关键修改说明
- 用
StringBuilder替代字符串拼接:避免频繁创建字符串对象,大幅提升效率,尤其在处理长句子时。 - 修复首字母提取逻辑:将添加空格改为添加空格后的字母,符合需求。
- 增加下标越界判断:防止输入句子末尾有空格时抛出异常。
- 跳过已处理的字母:处理完空格后的首字母后,将
i自增1,避免重复处理同一个字符。 - 修正main方法签名:符合Java标准规范,原来无参的main在部分环境下可能运行异常。
你之前用continue或break导致异常,是因为break会直接终止整个循环,continue会跳过当前迭代的后续代码——但你需要的只是跳过第一个if语句,不是终止或跳过迭代,所以i == 0的判断就完全足够,不需要额外的控制语句。
内容的提问来源于stack exchange,提问作者Bongo Man
相关产品推荐
相关产品推荐

