给定一个
String text = "RHKKA";
如何高效地将所有的‘R’替换为‘H’,所有的‘H’替换为‘E’,所有的‘K’替换为‘L’,所有的‘A’替换为‘O’?字符串文本最终将变成‘HELLO’。
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+,你可以使用以下方法:
String result = text.chars()
.mapToObj(c -> String.valueOf(map.get((char) c)))
.collect(Collectors.joining());//HELLO
如果使用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
StringBuilder
,您可以直接从toCharArray()
更新char[]
,然后从那个构建一个新的字符串。(或者用整个文本构造StringBuilder,逐个字符更新它。有点类似的方法。) - Andy TurnerStringBuilder result = new StringBuilder(text)
和 charAt/set 来完成大部分相同的操作,因为 StringBuilder
只是一个围绕着 char[]
的包装器。 - Andy Turner我认为你最好的选择是创建一个新的 String
或 StringBuilder
,通过用正确的字符替换原始字符串中的所有字符来实现。
类似以下代码:
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
这里有一种基于字符替换的替代方法:
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
。标准Java中没有这样的函数,但您可以查看Apache Commons StringUtils.replaceChars,它可以一次性将组替换为另一个组,从而有效地执行与Unix tr命令相同的操作:
StringUtils.replaceChars("RHKKA", "RHKA", "HELE") = "HELLO".