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

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

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

  1. char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
  2. String newStr = "";
  3. for (int x = 0; x < str.length(); x++) {
  4. char letter = str.charAt(x);
  5. for (int j = 0; j < vowels.length; j++) {
  6. if (letter == vowels[j]) {
  7. newStr = newStr + '_';
  8. break;
  9. } else {
  10. newStr = newStr + letter;
  11. break;
  12. }
  13. }
  14. }
  15. out.println(newStr);
chy5wohz

chy5wohz1#

在代码中,问题在嵌套的“for循环”中。我引用这句话是因为它实际上从不循环。第一次迭代 j=0 立即中断循环,因为您的字母等于 a(letter == vowels[0]) 不管怎样。不管是哪种情况,你都会 break; 并附加字符。这意味着您的循环可以简化为一个简单的 if-else 检查这封信是不是真的 a 并将其替换为 _ 或者留着。
要解决这个问题,您需要使用不同的方法。您可以创建一个元音字符串,例如“aeiouaeiou”,并使用indexof测试所选字符是否为元音。

  1. public static String omitVowels(String input) {
  2. StringBuilder out = new StringBuilder(input.length());
  3. String vowels = "aeiouAEIOU";
  4. for (int i = 0; i < input.length(); i++) {
  5. char c = input.charAt(i);
  6. if (vowels.indexOf(c) >= 0) // is vowel if index not negative
  7. out.append('_');
  8. else
  9. out.append(c);
  10. }
  11. return out.toString();
  12. }
  13. ``` `indexOf(char)` 会回来的 `-1` 如果提供的字符不是字符串的一部分,否则它将返回特定的索引。我们可以利用这个属性来测试字符是否是元音。
  14. 示例 `omitVowels("hello world")` ->
  15. "h_ll_ w_rld" `omitVowels("aeiou")` ->
  16. "_____" `omitVowels("TESTing")` -> `"T_ST_ng"`
展开查看全部
ruoxqz4g

ruoxqz4g2#

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

使用stringbuilder

注意使用 String . 这在java中是不可变的,因此要构建最终的字符串,应该使用 StringBuilder .

  1. public static String replaceVowel(String str) {
  2. final IntPredicate isVowel = ch -> ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
  3. StringBuilder buf = new StringBuilder(str.length());
  4. for (int i = 0; i < str.length(); i++) {
  5. char ch = str.charAt(i);
  6. boolean vowel = isVowel.test(Character.toLowerCase(ch));
  7. buf.append(vowel ? '_' : ch);
  8. }
  9. return buf.toString();
  10. }

使用正则表达式

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

  1. private static final Pattern VOWEL = Pattern.compile("[aeiou]");
  2. public static String replaceVowel(String str) {
  3. return VOWEL.matcher(str).replaceAll("_");
  4. }

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

展开查看全部
w8rqjzmb

w8rqjzmb3#

  1. for (int x = 0; x < str.length(); x++) {
  2. char letter = str.charAt(x);
  3. boolean toReplace = false;
  4. for (int j = 0; j < vowels.length; j++) {
  5. if (letter == vowels[j]) {
  6. toReplace = true;
  7. break;
  8. }
  9. }
  10. if (toReplace) {
  11. newStr = newStr + "_";
  12. } else {
  13. newStr = newStr + letter;
  14. }
  15. }

相关问题