如何用不同的字符替换字符串中的特定字符?

4

给定一个

String text = "RHKKA";

如何高效地将所有的‘R’替换为‘H’,所有的‘H’替换为‘E’,所有的‘K’替换为‘L’,所有的‘A’替换为‘O’?字符串文本最终将变成‘HELLO’。

2
你是否有整个字母表的映射,还是只有这些字母的映射? - Elliott Frisch
4个回答

9
你可以创建一个以字符为键和值的映射表,然后逐个字符进行循环,像这样:
String text = "RHKKA";
Map<Character, Character> map = new HashMap<>();
map.put('R', 'H');
map.put('H', 'E');
map.put('K', 'L');
map.put('A', 'O');
char[] chars = text.toCharArray();
for (int i = 0; i < chars.length; i++) {
    chars[i] = map.get(chars[i]);
}
String result = String.valueOf(chars);
System.out.println(result.toString());//HELLO

Java8+ 可能的解决方案

如果你使用的是 Java8+,你可以使用以下方法:

String result = text.chars()
        .mapToObj(c -> String.valueOf(map.get((char) c)))
        .collect(Collectors.joining());//HELLO

Java9+ 可能的解决方案

如果使用Matcher::replaceAll可能是另一种解决方案,操作如下:

String text = "RHKKA";
Map<Character, Character> map = Map.of('R', 'H', 'H', 'E', 'K', 'L', 'A', 'O');
text = Pattern.compile(".").matcher(text)
        .replaceAll(c -> String.valueOf(map.get(c.group().charAt(0))));//HELLO

You can read more about Map.of


当然,你需要确保映射完整(足够),否则输出字符串中就会充满“null”。 - Andy Turner
1
也许值得指出的是,在第一种方法中,您不需要StringBuilder,您可以直接从toCharArray()更新char[],然后从那个构建一个新的字符串。(或者用整个文本构造StringBuilder,逐个字符更新它。有点类似的方法。) - Andy Turner
@AndyTurner 你是不是指的是这个演示?另外,我不太明白最后一部分的意思 (或者用整个文本构建StringBuilder,并逐个字符更新。有点类似的方法。) - Youcef LAIDANI
1
@YCF_L 是的。至于第二部分,我的意思是你可以使用 StringBuilder result = new StringBuilder(text) 和 charAt/set 来完成大部分相同的操作,因为 StringBuilder 只是一个围绕着 char[] 的包装器。 - Andy Turner
1
谢谢@AndyTurner,好主意。我会编辑我的答案并加入这个建议。 - Youcef LAIDANI
1
我希望我能给Java9的Map.of()点赞两次;-) - GhostCat

0

我认为你最好的选择是创建一个新的 StringStringBuilder,通过用正确的字符替换原始字符串中的所有字符来实现。
类似以下代码:

String text = "RHKKA";
StringBuilder newString = new StringBuilder(text.length());

for (int i = 0; i < text.length(); i++) {
     char newChar = text.charAt(i);
     if (text.charAt(i) == 'R')
         newChar = 'H';
     else if (text.charAt(i) == 'H')
         newChar = 'E';
     else if (text.charAt(i) == 'K')
         newChar = 'L';
     else if (text.charAt(i) == 'A')
         newChar = 'O';
     newString.append(newChar);
}
System.out.println(newString); //prints HELLO

0

这里有一种基于字符替换的替代方法:

String text = "RHKKA";

String before = "RHKA";       // before mapping
String after  = "HELO";       // after mapping

String output = Arrays.stream(text.split(""))                   // Split by characters
    .map(i -> String.valueOf(after.charAt(before.indexOf(i))))  // Replace each letter
    .collect(Collectors.joining(""));                           // Collect to String

System.out.println(output);   // HELLO

顺便说一下,我确定你想用 O 替换 A,而不是像你在描述中写的那样用 E

0

标准Java中没有这样的函数,但您可以查看Apache Commons StringUtils.replaceChars,它可以一次性将组替换为另一个组,从而有效地执行与Unix tr命令相同的操作:

StringUtils.replaceChars("RHKKA", "RHKA", "HELE") = "HELLO".

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接