//值数组的格式为{" 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是否更好,或者上面的实现是否正常?
答案 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
,这将导致意外有效替换a
到c
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;
}