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

Java 独立替换字符串中的一组子字符串(并行),java,string,dictionary,replace,str-replace,Java,String,Dictionary,Replace,Str Replace,//值数组的形式为{“var1”、“val1”、“var2”、“val2”、…} 公共静态字符串替换方法(字符串模板、字符串…值){ 字符串p=模板; 对于(int i=0;iabcd 值的子字符串数组[“a”、“b”、“c”、“d”] 意思是用“b”替换“a”,用“c”替换“b” 所以,现在问题来了 1.我的上述实现在第一个循环中将“a”替换为“b”,然后在第二个循环中将“b”替换为“c”,使最后一个字符串成为“cccd”。但我想把它改成“bccd”。串联替换使用先前替换的字符串进一步工作。

//值数组的形式为{“var1”、“val1”、“var2”、“val2”、…}

公共静态字符串替换方法(字符串模板、字符串…值){
字符串p=模板;
对于(int i=0;i
此方法使用字符串中的相应值替换一组子字符串。 例如:-string=>abcd 值的子字符串数组[“a”、“b”、“c”、“d”] 意思是用“b”替换“a”,用“c”替换“b”

所以,现在问题来了

1.我的上述实现在第一个循环中将“a”替换为“b”,然后在第二个循环中将“b”替换为“c”,使最后一个字符串成为“cccd”。但我想把它改成“bccd”。串联替换使用先前替换的字符串进一步工作。 是否有一种方法可以更有效地并行替换所有子字符串


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

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


在更一般的情况下,您可以将“a”替换为“b”,然后将“b”替换为“c”。。。依此类推,最后删除所有下划线。当然,如果模板文本包含下划线,您可以选择另一个您知道不存在的字符,然后改用它。

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


在更一般的情况下,您可以将“a”替换为“b”,然后将“b”替换为“c”。。。依此类推,最后删除所有下划线。当然,如果您的模板文本包含下划线,您可以选择另一个您知道不存在的字符,然后改用它。

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

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);
String template=“abcd”;
StringBuilder populatedTemplate=新建StringBuilder();
HashMap=newHashMap();
地图。放置('a','b');
地图放置('b','c');
对于(int i=0;i
与此解决方案相比,此解决方案的一些支持参数

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

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

      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);
      
      String template=“abcd”;
      StringBuilder populatedTemplate=新建StringBuilder();
      HashMap=newHashMap();
      地图。放置('a','b');
      地图放置('b','c');
      对于(int i=0;i
      与此解决方案相比,此解决方案的一些支持参数

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

      使用Map而不是字符串数组的解决方案,以避免ArrayIndexOutOfBoundsException。例如,您将使用字符串数组获得此调用的异常:

      replace方法(“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;    
       }
      
      公共静态字符串替换方法映射(字符串模板,映射映射){
      字符串p=模板;
      for(字符串键:map.keySet()){
      p=p.replace(key,map.get(key));
      }
      返回p;
      }
      
      使用Map而不是String数组的解决方案,以避免获取ArrayIndexOutOfBoundsException。例如,您将使用字符串数组获得此调用的异常:

      replace方法(“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;    
       }
      
      公共静态字符串替换方法映射(字符串模板,映射映射){
      字符串p=模板;
      for(字符串键:map.keySet()){
      p=p.replace(key,map.get(key));
      }
      返回p;
      }
      
      在我看来,从数组中删除第一个元素似乎是个问题……你想说的话很不连贯。如果
      template=“abcd”
      values={a”,“b”,“c”,“d”}
      则输出为
      bbdd
      @Hackerdarshi如果template-“abcd”和values={a”,“b”,“c”,“d”},则a->b和c->d,我正在使用数组的交替索引来表示键值对。对我来说,这似乎是从数组中删除第一个元素的问题……你想说的话很不连贯。如果
      template=“abcd”
      values={a”,“b”,“c”,“d”}
      那么输出是
      bbdd
      @Hackerdarshi如果template-“abcd”和values={a”,“b”,“c”,“d”},那么a->b和c->d,我正在为键值对使用数组的替代索引。谢谢,这就是我正在寻找的。你能给我一些吗