用下一个替换元音不起作用

时间:2018-06-19 11:30:20

标签: java replace

我有一个字符串输入,想用下一个元音替换该字符串中的每个元音

但是,它似乎无法正常工作。我尝试了各种输入,例如:

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

4 个答案:

答案 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