【问题标题】:Replacing a set substrings in a string independently (parallel)独立替换字符串中的一组子字符串(并行)
【发布时间】:2016-09-08 07:38:36
【问题描述】:

// 值数组的格式为 { "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.我的上述实现在第一个循环中将 'a' 替换为 'b',然后在第二个循环中,将 'b' 替换为 'c' ,使最终字符串为“cccd”。但我希望输出为“bccd”。串联替换使用先前替换的字符串来进一步工作。 有没有办法以更有效的方式并行替换所有子字符串。

2.如何使用 Map 而不是数组(上述方法的第二个参数)实现上述方法? Map 更好,还是上面的实现很好?

【问题讨论】:

  • 对我来说似乎是从数组中删除第一个元素的问题......stackoverflow.com/questions/3663944/…
  • 你想说的很不连贯。如果template = "abcd"values = {"a","b","c","d"} 则输出为bbdd
  • @Hackerdarshi if template - "abcd " and values ={"a","b","c","d"} ,然后是 a ->b 和 c->d ,我是为键值对使用数组的备用索引。

标签: java string dictionary replace str-replace


【解决方案1】:

您最好使用映射并遍历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,这将导致意外有效地将a 替换为@ 987654329@
  • 只迭代一次template
  • 不要为每个替换对创建一个新的String 对象,因为它会在这里p = p.replace(values[i], values[i+1]);

【讨论】:

  • 谢谢,这就是我要找的。您能否提供更多有关此实施的优点?我能想到的一个是,只对模板字符串进行一次迭代。但在我的实现中,模板字符串在迭代 no_of_string 次。
  • @tarun14110 我添加了更多解释。
  • 嘿,谢谢。你能回答这个stackoverflow.com/questions/37217588/…。它与这个有关。
  • @tarun14110 我相信这不再相关了。正如你已经从 Nicolas 那里得到了答案。对我来说,它完全符合您的要求。
【解决方案2】:

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

在更一般的情况下,您可以将 'a' 替换为 'b',然后将 'b' 替换为 'c'... 以此类推,并且最后删除所有的下划线。当然,如果您的模板文本包含下划线,您可以选择另一个您知道不会出现的字符,并使用它来代替。

【讨论】:

    【解决方案3】:

    使用 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;    
     }
    

    【讨论】:

      猜你喜欢
      • 2020-04-05
      • 2012-04-03
      • 2013-07-23
      • 1970-01-01
      • 2022-08-17
      • 2016-11-28
      相关资源
      最近更新 更多