独立替换字符串中的一组子字符串(并行)

Replacing a set substrings in a string independently (parallel)

// 值数组的形式为 { "var1", "val1", "var2", "val2",.. }

 public static String replaceMethod(String template, String... values) {
            String p = template;
            for (int i = 0; i < values.length; i += 2) {
                p = p.replace(values[i], values[i+1]);
            }

            return populatedTemplate;    
        }

此方法用字符串中的相应值替换一组子字符串。 例如:- 字符串 => abcd 值的子字符串数组 ["a","b","c","d"] 这意味着将 'a' 替换为 'b',将 'b' 替换为 'c'。

那么,问题来了。

1.My 上面的实现在第一个循环中将 'a' 替换为 'b' 然后在第二个循环中,它将 'b' 替换为 'c' ,从而生成最终字符串作为 "cccd"。但我希望输出为 "bccd"。串联替换使用先前替换的字符串来进一步工作。 有没有办法以更有效的方式并行替换所有子字符串。

2.How 我可以使用 Map 而不是数组(上述方法的第二个参数)来实现上述方法吗? Map 更好,还是上面的实现更好?

在 a 到 b、b 到 c 和此类比较的特定情况下,您可以通过以相反顺序提供值数组来获得所需的结果。

在更一般的情况下,您可以将 'a' 替换为“b”,然后将 'b' 替换为“c'...等等,最后去掉所有的下划线。当然,如果你的模板文本中包含下划线,你可以选择另一个你知道不会出现的字符来代替。

您最好使用地图并遍历 template 中的每个字符。这样您就可以避免在同一索引位置进行多次替换。

String template = "abcd";
StringBuilder populatedTemplate = new StringBuilder();
HashMap<Character, Character> map = new HashMap<>();
map.put('a', 'b');
map.put('b', 'c');
for (int i = 0; i < template.length(); i++) {
    populatedTemplate.append(
            map.getOrDefault(template.charAt(i), template.charAt(i)));
}
System.out.println(populatedTemplate);

与 OP 发布的解决方案相比,此解决方案的一些支持论点。

  • 避免在同一索引位置进行多次替换,在第一步中将 a 替换为 b,在第二步中将 b 替换为 c,这将导致ac
  • 的意外有效替换
  • 仅在 template
  • 上迭代一次
  • 不要为每个替换对创建一个新的 String 对象,因为它本来应该在这里 p = p.replace(values[i], values[i+1]);

继续使用 Map 而不是 String 数组的解决方案,以避免出现 ArrayIndexOutOfBoundsException。例如,您将使用 String 数组进行此调用时出现异常:

replaceMethod("abcd", "a","b","c")

使用地图:

     public static String replaceMethodMap(String template, Map<String, String> map) {
     String p = template;
     for (String key : map.keySet()) {
         p = p.replace(key, map.get(key));
     }

     return p;    
 }