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

标签 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;    
        }

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

那么,现在问题来了。

1.我的上述实现在第一个循环中将 'a' 替换为 'b' ,然后在第二个循环中,将 'b' 替换为 'c' ,使最终字符串为“cccd”。但我希望输出为“bccd”。系列替换使用先前替换的字符串来进一步工作。 有没有一种方法可以更有效地并行替换所有子字符串。

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

最佳答案

您最好使用映射并迭代模板中的每个字符。这样您就可以避免在同一索引位置进行多次替换。

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
  • 仅在模板上迭代一次
  • 不要为每个替换对创建一个新的 String 对象,因为它本来就是这里的 p = p.replace(values[i], values[i+1]) ;

关于java - 独立(并行)替换字符串中的一组子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37187433/

相关文章:

java - 为什么不是原始类型,泛型类中的静态变量?

java - Mockito、JUnit 和 Map 嵌套在另一个类中

python - Numpy:加载多个 CSV 文件作为字典

java - Java通讯录程序

java - 如果读取相同的文本则停止 BufferedReader

python - 如何检查字符串列表中是否存在字符串,包括子字符串?

c - 为什么两个字符串在与 equals == 运算符比较时,即使输出相同,也不匹配?

C# 静态字典在抽象类 .NET 2.0 中声明和初始化

java - 使用大多数 Java 代码制作可执行文件,但可能会添加另一种语言

c - 在 C 中如何 strcmp 只是开头的 2 个字符然后连接?