该程序应使用字符串,检查每个字母是否为元音,然后将元音更改为下划线。例如,如果输入some,则应输出s_m_。我觉得这应该是一个简单的编程练习。但是我真的很沮丧,无法告诉我我在做什么错。

我已经声明了一个保留元音的数组,一个newStr变量将包含更新后的字符串,并且我遍历该字符串,使用charAt()比较每个字母以检查它是否在vowels数组中。如果是,我将_添加到更新的String中,如果不是,则保留原始字母。最终输出是错误的,我在做什么错?

char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
String newStr = "";

for (int x = 0; x < str.length(); x++) {
    char letter = str.charAt(x);

    for (int j = 0; j < vowels.length; j++) {
        if (letter == vowels[j]) {
            newStr = newStr + '_';
            break;
        } else {
            newStr = newStr + letter;
            break;
        }
    }
}

out.println(newStr);

最佳答案

在您的代码中,问题出在嵌套的“ for-loop”内。我之所以用引号表示,是因为它实际上从未循环。第一次迭代j=0立即中断循环,因为您的字母等于或等于a(letter == vowels[0])。无论哪种情况,您都执行break;并附加字符。这意味着您可以将循环简化为一个简单的if-else,该字母可以检查字母是否为a并将其替换为_或保留它。

要解决此问题,您需要使用其他方法。您可以创建一个元音字符串,例如“ aeiouAEIOU”,并使用indexOf测试所选字符是否为元音。

public static String omitVowels(String input) {
    StringBuilder out = new StringBuilder(input.length());
    String vowels = "aeiouAEIOU";
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (vowels.indexOf(c) >= 0) // is vowel if index not negative
            out.append('_');
        else
            out.append(c);
    }
    return out.toString();
}


如果提供的字符不是字符串的一部分,则indexOf(char)将返回-1,否则它将返回特定的索引。我们可以使用此属性来测试字符是否为元音。

例子

omitVowels("hello world")-> "h_ll_ w_rld"

omitVowels("aeiou")-> "_____"

omitVowels("TESTing")-> "T_ST_ng"

08-06 03:46