小程序中的输出不正确。为什么这个String变量没有按照我想要的去做?

时间:2019-02-04 15:56:57

标签: java arrays string char

该程序应使用字符串,检查每个字母是否为元音,然后将元音更改为下划线。例如,如果我输入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);

3 个答案:

答案 0 :(得分:1)

在您的代码中,问题出在嵌套的“ for-loop”内。我之所以用引号表示是因为它从未真正循环。第一次迭代j=0立即中断循环,因为您的字母是否等于a的{​​{1}}。无论哪种情况,您都执行(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")

答案 1 :(得分:0)

这很简单。只需遍历给定字符串的每个字符,并在元音为_的情况下将其替换为

使用StringBuilder

当心使用String。在Java中这是不可变,因此,要构建最终字符串,应使用StringBuilder

public static String replaceVowel(String str) {
    final IntPredicate isVowel = ch -> ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
    StringBuilder buf = new StringBuilder(str.length());

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        boolean vowel = isVowel.test(Character.toLowerCase(ch));
        buf.append(vowel ? '_' : ch);
    }

    return buf.toString();
}

使用RegularExpression

或者,您可以将正则表达式replaceAll()类的String方法一起使用。

private static final Pattern VOWEL = Pattern.compile("[aeiou]");

public static String replaceVowel(String str) {
    return VOWEL.matcher(str).replaceAll("_");
}

这也是正确的,因为在后台,replaceAll()使用StringBUilder

答案 2 :(得分:-1)

for (int x = 0; x < str.length(); x++) {
 char letter = str.charAt(x);
 boolean toReplace = false;
 for (int j = 0; j < vowels.length; j++) {
    if (letter == vowels[j]) {
        toReplace = true;
        break;
    }
 }
 if (toReplace) {
    newStr = newStr + "_";
 } else {
    newStr = newStr + letter;
 }
}