小程序输出不正确为什么这个字符串变量没有做我想要的事情?

liwlm1x9  于 2021-07-12  发布在  Java
关注(0)|答案(3)|浏览(218)

这个程序应该取一个字符串,检查每个字母是否是元音,并将元音改成下划线。例如,如果我进入 some 它应该输出 s_m_ . 这是一个简单的编程练习,我觉得我应该能够做到。然而,我真的被难住了,我不知道我做错了什么。
我已经声明了一个数组来保存元音 newStr 变量,它将包含更新的字符串,我在字符串中循环,使用 charAt() 检查它是否在房间里 vowels 数组。如果是,我补充说 _ 更新后的字符串,如果不是,我保留原来的字母。最终输出错误,我做错了什么?

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);
chy5wohz

chy5wohz1#

在代码中,问题在嵌套的“for循环”中。我引用这句话是因为它实际上从不循环。第一次迭代 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"` 
ruoxqz4g

ruoxqz4g2#

这很简单。只需迭代给定字符串的每个字符并替换为 _ 如果是元音。

使用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();
}

使用正则表达式

或者,可以将正则表达式与 replaceAll() 方法 String 班级。

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

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

这也是正确的,因为在背景中, replaceAll() 使用 StringBUilder .

w8rqjzmb

w8rqjzmb3#

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;
 }
}

相关问题