有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java替换字符串中的值映射

假设我有一个String text = "abc",我想替换一个值映射,例如:

a->b
b->c
c->a

你会怎么做

因为很明显:

map.entrySet().forEach(el -> text = text.replaceAll(el.getKey(), el.getValue()))

不起作用,因为第二个替换也将覆盖第一个替换(最后您将不会得到bca

那么,您将如何避免这种“替换以前的替换”

我看到了this answer,但我希望有一个更简洁、更幼稚的解决方案(希望没有使用Apache外部包)

顺便说一下字符串也可以是多个字符


共 (3) 个答案

  1. # 1 楼答案

    我用java streams提出了这个解决方案

    String text = "abc";
    Map<String, String> replaceMap = new HashMap<>();
    replaceMap.put("a", "b");
    replaceMap.put("b", "c");
    replaceMap.put("c", "a");
    
    System.out.println("Text = " + text);
    
    text = Arrays.stream(text.split("")).map(x -> {
        String replacement = replaceMap.get(x);
        if (replacement != null) {
            return x.replace(x, replacement);
        } else {
            return x;
        }
    }).collect(Collectors.joining(""));
    
    System.out.println("Processed Text = " + text);
    

    输出

    Text = abc
    Processed Text = bca
    
  2. # 2 楼答案

    Java 8之后,有一个名为^{}的方法返回一个IntStream,从中可以获得一个与该字符所表示的整数对应的字符,并使用映射将其映射

    如果你的地图是字符串对字符串的地图,那么你可以使用:

    text = text.chars().mapToObj(el -> map.get(String.valueOf((char)el))).
                                                     collect(Collectors.joining(""));
    

    如果你的地图是字符对字符的,那么只需删除字符串即可。价值

    text = text.chars().mapToObj(el -> map.get((char)el)).collect(Collectors.joining(""));
    
  3. # 3 楼答案

    这是一个问题,我会正常处理正则表达式替换。Java中的代码有点冗长,但这应该是可行的:

    String text = "abc";
    Map<String, String> map = new HashMap<>();
    map.put("a", "b");
    map.put("b", "c");
    map.put("c", "a");
    
    String regex = map.keySet()
                      .stream()
                      .map(s -> Pattern.quote(s))
                      .collect(Collectors.joining("|"));
    
    String output = Pattern.compile(regex)
                           .matcher(text)
                           .replaceAll((m) -> {
                               String s = m.group();
                               String r = map.get(s);
                               return r != null ? r : s;
                           });
    System.out.println(output); 
    // bca
    

    它相对简单,但有点冗长,因为Java。首先,创建一个regex表达式,该表达式将接受映射中的任何键(使用Pattern.quote()对它们进行清理),然后使用lambda replacement在找到实例时从映射中提取适当的替换

    性能密集型部分首先只是编译正则表达式;替换本身应该只通过字符串一次

    应与Java 1.9+兼容