【问题标题】:How to replace specific characters in a String with different ones?如何用不同的字符替换字符串中的特定字符?
【发布时间】:2019-02-01 08:43:19
【问题描述】:

给定一个

String text = "RHKKA";

如何有效地将所有'R'替换为'H',所有'H'替换为'E',所有 'K''L' 以及所有 'A''O'

字符串文本将是HELLO

【问题讨论】:

  • 你有整个字母表的映射,还是只有那些字母?

标签: java arrays string replace


【解决方案1】:

您可以创建一个字符映射作为键和值,然后像这样逐个字符循环:

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

你可以阅读更多关于Map.of

【讨论】:

  • 当然,你需要确保映射是完整的(足够),否则你的输出字符串会充满nulls。
  • 另外也许值得指出的是,您不需要第一种方式的StringBuilder,您可以从toCharArray() 更新char[],然后从中构建一个新字符串。 (或者用整个文本构造 StringBuilder,一次更新一个字符。有点相同的方法。)
  • @YCF_L 是的。对于第二部分,我的意思是你可以对 StringBuilder result = new StringBuilder(text) 和 charAt/set 做同样的事情,因为 StringBuilder 只是 char[] 的包装。
  • 谢谢@AndyTurner 好主意,我用这个编辑我的答案
  • 我希望我可以为 Java9 Map.of() 投票两次 ;-)
【解决方案2】:

这是基于字符替换的另一种方法:

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

【讨论】:

    【解决方案3】:

    我认为最好的办法是创建一个新的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
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多