Java实现字符串消元音功能报String index out of range:22异常如何解决
错误原因
- 你在循环开始前就固定了
lengthStr为原字符串的初始长度,但是每次执行删除元音的操作后,字符串实际长度会不断缩短,当循环变量i增长到超过当前字符串的最大索引时,调用str.charAt(i)就会触发索引越界异常 - 额外隐藏问题:即使你把循环条件改成动态判断长度,删除字符后没有回退
i,会导致连续相邻的元音出现漏删的情况:比如删除索引i位置的元音后,原索引i+1的字符会前移到i位置,下一轮循环i直接自增,就会跳过这个新到i位置的字符
修复方案
这里提供两种可行实现,更推荐第二种,避免频繁生成新字符串对象,性能更好:
方案1:修改原有逻辑
class Troll { private static final char[] VOWELS = {'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U'}; public static String disemvowel(String str) { // 循环条件动态取当前字符串的长度,不要用固定的初始长度 for (int i = 0; i < str.length(); ++i) { for (char vowel : VOWELS) { if (str.charAt(i) == vowel) { str = removeChar(str, i); // 删除成功后回退i,避免漏删下一个前移到当前位置的字符 i--; // 匹配到元音后跳出元音判断循环,避免重复判断 break; } } } return str; } private static String removeChar(String str, int index) { return str.substring(0, index) + str.substring(index + 1); } }
方案2:使用StringBuilder拼接非元音字符(推荐)
class Troll { private static final char[] VOWELS = {'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U'}; public static String disemvowel(String str) { StringBuilder sb = new StringBuilder(); for (char c : str.toCharArray()) { boolean isVowel = false; for (char vowel : VOWELS) { if (c == vowel) { isVowel = true; break; } } // 不是元音就拼接到结果里 if (!isVowel) { sb.append(c); } } return sb.toString(); } }
内容的提问来源于stack exchange,提问作者Erdem Kara
相关产品推荐
相关产品推荐

