如何实现输出字符串中每个元音各一次?现有代码仅返回首个元音
提取字符串中每个出现过的元音各一次的实现方法
问题背景
你当前的代码只会返回字符串中遇到的第一个元音,现在需要修改成能输出每个出现过的元音各一次的功能。
原代码:
public static String vowels(String str) { String vowels = "auioeëyAUIOEËY"; for(int i = 0;i < str.length();i++) { for(int j = 0;j < str.length();j++) { if(str.charAt(i) == vowels.charAt(j)) { return "cointains " + vowels.charAt(j) ; } } } return "none"; }
原代码的问题
- 内层循环边界错误:
j < str.length()应该改成j < vowels.length(),否则会越界访问vowels字符串 - 找到第一个匹配元音就直接
return,程序直接终止,没法继续收集后续的其他元音 - 没有去重逻辑,就算同一个元音多次出现,也不需要重复输出
解决方案
用Set来存储遇到的元音(Set本身自带去重特性),遍历字符串的每个字符,判断是否是元音,是的话加入Set,最后把Set里的内容整理成结果返回。
修改后的代码:
import java.util.HashSet; import java.util.Set; public static String vowels(String str) { String vowels = "auioeëyAUIOEËY"; Set<Character> foundVowels = new HashSet<>(); for (int i = 0; i < str.length(); i++) { char currChar = str.charAt(i); // 检查当前字符是否是元音 if (vowels.indexOf(currChar) != -1) { foundVowels.add(currChar); } } if (foundVowels.isEmpty()) { return "none"; } // 拼接结果字符串 StringBuilder result = new StringBuilder("contains "); for (char vowel : foundVowels) { result.append(vowel).append(" "); } // 移除末尾多余空格 return result.toString().trim(); }
补充说明
- 如果不需要区分元音的大小写(比如把所有元音统一成小写输出),可以在添加到Set前做转换:
这样就不会重复记录同一个元音的大小写形式。foundVowels.add(Character.toLowerCase(currChar)); - 用
vowels.indexOf(currChar)替代原来的双层循环,代码更简洁,效率也更高。
内容的提问来源于stack exchange,提问作者Noname
相关产品推荐
相关产品推荐

