我有一个字符串输入,想用下一个元音替换该字符串中的每个元音。
但是,它似乎无法正常工作。我尝试了各种输入,例如:
venky -> vinky // Correct
ui -> uo // Incorrect, expected ao
ai -> ao // Incorrect, expected eo
元音顺序是
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
我的代码是:
package test;
import java.util.Scanner;
public class Problem1 {
public static void main(String args[]) {
Scanner r = new Scanner(System.in);
String str, res;
char ch;
int i, j;
char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
System.out.println("Enter a string");
str = r.nextLine();
res = str;
for (i = 0; i < str.length(); i++) {
ch = str.charAt(i);
for (j = 0; j < 4; j++) {
if (ch == 'u') {
res = str.replace(ch, 'a');
break;
} else if (ch == vowels[j]) {
res = str.replace(ch, vowels[j+1]);
break;
}
}
}
System.out.println("String after replacing the vowels with next vowel : "
+ res);
}
}
答案 0 :(得分:1)
您的问题在这里:
res = str.replace(ch, vowels[j+1]);
考虑输入ai。第一次传递时,将res的值更改为ei,第二次将i替换为初始字符串ai,而不是修改后的字符串。因此res获得新值ao。
无论如何,即使您解决了这种特殊情况,在替换第一次出现的情况时,您也可能遇到包含长字的长单词的其他问题(想象一下ae的情况,即得到)。您应该一次生成一个字符,并使用未修改的字母或下一个摆动。
答案 1 :(得分:1)
您要替换str
变量中的元音并将其保存到res
中,然后中断并继续操作str
,其中先前的元音没有被替换。
您需要将响应逐个字符地组合在一起
答案 2 :(得分:1)
您的问题是ipconfig
将替换您字符串中所有出现的字符。
由于遍历字符串,一个原始字符可能会被替换多次,例如:
myglobalip.com
您将收到String.replace
而不是acac -> ecec -> ecic
。
所以我认为您可以基于当前的Strin创建另一个String,以避免ecic
的副作用:
ecec
答案 3 :(得分:0)
res = str.replace(ch, vowels[j+1]);
将替换字符串值并放入res
变量,但是下次它将不使用旧的res变量进行进一步的修改,这就是为什么给出错误答案的原因。
str = str.replace(ch, 'a');
str = str.replace(ch, vowels[j+1]);
并打印str
而不是len