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

如何实现输出字符串中每个元音各一次?现有代码仅返回首个元音

提取字符串中每个出现过的元音各一次的实现方法

问题背景

你当前的代码只会返回字符串中遇到的第一个元音,现在需要修改成能输出每个出现过的元音各一次的功能。

原代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:20:54