【发布时间】:2019-02-01 08:43:19
【问题描述】:
给定一个
String text = "RHKKA";
如何有效地将所有'R'替换为'H',所有'H'替换为'E',所有 'K' 和 'L' 以及所有 'A' 和 'O'?
字符串文本将是HELLO。
【问题讨论】:
-
你有整个字母表的映射,还是只有那些字母?
标签: java arrays string replace
给定一个
String text = "RHKKA";
如何有效地将所有'R'替换为'H',所有'H'替换为'E',所有 'K' 和 'L' 以及所有 'A' 和 'O'?
字符串文本将是HELLO。
【问题讨论】:
标签: java arrays string replace
您可以创建一个字符映射作为键和值,然后像这样逐个字符循环:
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
你可以阅读更多关于Map.of
【讨论】:
nulls。
StringBuilder,您可以从toCharArray() 更新char[],然后从中构建一个新字符串。 (或者用整个文本构造 StringBuilder,一次更新一个字符。有点相同的方法。)
StringBuilder result = new StringBuilder(text) 和 charAt/set 做同样的事情,因为 StringBuilder 只是 char[] 的包装。
这是基于字符替换的另一种方法:
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
顺便说一句,我确定您打算将 A 替换为 O.. 而不是您在描述中的 E。
【讨论】:
我认为最好的办法是创建一个新的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
【讨论】:
标准 Java 中没有这样的功能,但您可以查看 Apache Commons StringUtils.replaceChars,它一次性将组替换为另一个组,有效地执行与 Unix tr 命令相同的操作:
StringUtils.replaceChars("RHKKA", "RHKA", "HELE") = "HELLO".
【讨论】: