在Java中处理字符串

时间:2018-10-26 01:12:37

标签: java string

嗨,我在用Java处理字符串时遇到了麻烦。我的问题是搜索字符串,找到元音时,我想在该位置插入另一个字符串。这是我所拥有的:

Scanner scan = new Scanner(input.getText());

    while(scan.hasNext()){
        String str = scan.next();
        str = str.toUpperCase();
        String str1 = "";

        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == 'A' || str.charAt(i) == 'E'
                    || str.charAt(i) =='I' || str.charAt(i) == 'O'
                    || str.charAt(i) == 'U'){

                    str1 = str.substring(0 , i) + "AHHH" + str.substring(i);

            }
        }

        System.out.print(str1);
    }

因此,如果扫描程序读取的字符串是hello,则应返回:

HAHHHELLAHHHO

我的程序正在返回:

HAHHHELLOHELLAHHHO

所以我的程序是找到添加AHHH的第一个元音,然后将其与字符串的其余部分连接起来。然后,找到下一个元音并执行相同的操作。

任何人都知道我可以如何更好地操纵此字符串,或者仅使用字符串便有可能吗?

4 个答案:

答案 0 :(得分:2)

我会更喜欢{em> StringBuilder,而我会更喜欢String.toUpperCase()循环{em> String.toCharArray()for-each 。例如,

String str = "hello";
StringBuilder sb = new StringBuilder();
for (char ch : str.toUpperCase().toCharArray()) {
    if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
        sb.append("AHHH");
    }
    sb.append(ch);
}
System.out.println(sb);

输出(按要求)

HAHHHELLAHHHO

另一种选择,使用正则表达式对元音进行分组,并将其替换为“ AHHH”和分组。喜欢,

System.out.println(str.toUpperCase().replaceAll("([AEIOU])", "AHHH$1"));

答案 1 :(得分:1)

您的问题在这里:

str1 = str.substring(0 , i) + "AHHH" + str.substring(i);
//                   ^

每次找到元音时,都会在原始字符串的开头再次添加一个子字符串。

第二,在循环中串接字符串效率低下,最好使用StringBuilder


将所有内容放在一起:

import java.util.*;

public class Test {
  public static void main(String[] args) {
    String str = "hello";
    StringBuilder sb = new StringBuilder();

    for (char c : str.toUpperCase().toCharArray()) {
      if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
        sb.append("AHHH");
      }

      sb.append(c);
    }   

    System.out.print(sb.toString());
  }
}

或者,您可以只将replaceAll()与正则表达式一起使用:

public class Test {
  public static void main(String[] args) {
    String str = "hello";
    String result = str.toUpperCase().replaceAll("([AEIOU])", "AHHH$1");

    System.out.println(result);
  }
}

答案 2 :(得分:0)

将for循环更改为此:-

for (int i = 0; i < str.length(); i++) {
    if (str.charAt(i) == 'A' || str.charAt(i) == 'E'
            || str.charAt(i) == 'I' || str.charAt(i) == 'O'
            || str.charAt(i) == 'U') {
        str1 += "AHHH";
    }
    str1 += str.charAt(i);
}

这是完整的工作示例:-

public static void main(String[] args) {
    String str = "hello".toUpperCase();
    String str1 = "";

    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == 'A' || str.charAt(i) == 'E'
                || str.charAt(i) == 'I' || str.charAt(i) == 'O'
                || str.charAt(i) == 'U') {
            str1 += "AHHH";
        }
        str1 += str.charAt(i);
    }
    System.out.print(str1);
}

不过最好在循环中使用StringBuilder

答案 3 :(得分:0)

每当您的循环找到元音时,它就会再次连接HELLO。因此,当它命中E时,str1看起来像“ HAHHHELLO”,但是一旦它命中了O,它就会再次添加HELLO,因为您使用的是原始字符串的子字符串。