编写一个使用`replace`方法在一个字符串中交换字母“ e”和“ o”的程序

时间:2018-11-05 21:04:56

标签: java collections java-8 java-stream

例如,如果我有Hello World,它应该变成Holle Werld。如何使用String.replace执行此操作?我尝试做"Hello World".replace("e","o"),但我只得到Hollo World,如果再次使用,我会得到Helle Werld

6 个答案:

答案 0 :(得分:6)

您也可以这样做:

String result = Arrays.stream(input.split(""))
                      .map(c -> c.equals("e") ? "o" : c.equals("o") ? "e" : c)
                      .collect(Collectors.joining());

答案 1 :(得分:3)

优化的Java 8解决方案:

String str = "Hello World!";

String result = str.codePoints()
                   .map(c -> c == 'e' ? 'o' : c == 'o' ? 'e' : c)
                   .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                   .toString();

此解决方案避免使用诸如String.replaceString.split甚至String.equals之类的重量级方法。

答案 2 :(得分:2)

我可能在这里将字符串视为字符数组,并对其进行迭代:

String input = "Hello World";
char[] letters = input.toCharArray();
for (int i=0; i < letters.length; ++i) {
    if (letters[i] == 'e') {
        letters[i] = 'o';
    }
    else if (letters[i] == 'o') {
        letters[i] = 'e';
    }
}

String output = new String(letters);
System.out.println(input);
System.out.println(output);

Hello World
Holle Werld

请注意,我们可以在此处尝试使用虚拟字符作为占位符来进行String#replace。但这冒着占位符作为字符串一部分出现的风险。上述解决方案在所有情况下均适用。

答案 3 :(得分:2)

根据@Carlos Heuberger的建议,您可以使用'\uFFFF'作为占位符,使用String.replace()方法将字符彼此交换。'\uFFFF'被认为是非字符Unicode(即不能出现在字符串中)。

 String str = "Hello World";
 str = str.replace('o', '\uFFFF').replace('e', 'o').replace('\uFFFF', 'e');

希望有帮助。

答案 4 :(得分:1)

我假设您必须使用replace()
以下是一种方法:

String input = "Hello World";
input = input.replace("e","~");
input = input.replace("o","e");
input =input.replace("~","o);

注意:这假设String中没有"~"。这段代码不够健壮,无法处理这种情况。

答案 5 :(得分:0)

您还可以找到字符串中不包含的字符或字符组合,并将其用作替换的临时字符串。这是一个示例:

private void funnyReplace2(String myString){
    String unused = findUnused(myString);
    System.out.println("Unused character(s) used : "+unused);
    myString=myString.replace("e",unused);
    myString=myString.replace("o","e");
    myString=myString.replace(unused,"o");

    System.out.println(myString);

}

private String findUnused(String aString){
    String lookingForChar = "@#{}]@$^£¨*ù%µ§/.?,;:!&é()-èïô";
    int looper = 0;
    while(looper<lookingForChar.length()){
        looper++;
        for (int i =0; i<=lookingForChar.length()-looper; i++){
            if (!aString.contains(lookingForChar.substring(i,i+looper)))
                return lookingForChar.substring(i,i+looper);
        }
    }
    return "What kind of String do you have ??";
}