单独替换字符串中的set子串(并行)

时间:2016-05-12 12:49:53

标签: java string dictionary replace str-replace

//值数组的格式为{" 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;    
        }

此方法用字符串中的各个值替换一组子字符串。 例如: - string =&gt; A B C D      子串数组值[&#34; a&#34;,&#34; b&#34;,&#34; c&#34;,&#34; d&#34;]      这意味着取代&#39; a&#39;用&#39; b&#39;和&#39; b&#39;与&#39; c&#39;。

所以,现在问题来了。

1.我的上述实施取代了&#39; a&#39;用&#39; b&#39;在第一个循环中,然后在第二个循环中,它取代了&#39; b&#39;与&#39; c&#39; ,使最终字符串为&#34; cccd&#34;。但我希望将其作为&#34; bccd&#34;。系列替换使用先前替换的字符串进一步工作。 有没有办法以更有效的方式并行替换所有子字符串。

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

3 个答案:

答案 0 :(得分:2)

您最好使用地图并迭代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]);
  • 一样

答案 1 :(得分:0)

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

在更一般的情况下,您可以替换&#39; a&#39;用&#39; b &#39;然后&#39; b&#39;使用&#39; c &#39; ...依此类推,最后删除所有下划线。当然,您的模板文本是否包含下划线,您可以选择另一个您知道不会在那里的角色,而是使用它。

答案 2 :(得分:0)

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