嗨,我在用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的第一个元音,然后将其与字符串的其余部分连接起来。然后,找到下一个元音并执行相同的操作。
任何人都知道我可以如何更好地操纵此字符串,或者仅使用字符串便有可能吗?
答案 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,因为您使用的是原始字符串的子字符串。