【问题标题】:Substituting multiple Strings in String在字符串中替换多个字符串
【发布时间】:2015-03-30 09:11:39
【问题描述】:

我知道有很多与类似问题相关的问题和答案,但我找不到我的问题的答案。这是我的代码的一个小sn-p:

    private String substitute(String text) {
      List<Macro> macros = getMacros();

      for (Macro macro : macros) {
        text = StringUtils.replace(text, macro.getKey(), macro.getValue());
      }
      return text;
    }  
  1. 这是在文本字符串中替换多个宏变量的好方法吗?这会在每个循环上创建一个新的 String 对象,所以我想知道是否有更好的方法来做到这一点。理想情况下,我会使用 Apache Commons StrSubstitutor 类,但我不能因为令牌/宏的格式(不同的格式,而不是固定前缀/后缀之间)。由于性能问题,我也不想使用正则表达式。
  2. 根据工作中的一些编码规则,我需要将参数标记为final。我想知道这是否真的是一种很好的做法。我知道字符串是不可变的,而且我知道每当我调用StringUtils.replace() 时,它都会返回一个新的字符串对象。但我想知道这里的 String 参数是否应该按照建议标记为 final 并在方法中执行以下操作:

    String result = text;
    for (Macro macro : macros) {
      result = StringUtils.replace(result, macro.getKey(), macro.getValue());
    }
    

    我就是不喜欢这个。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java string substitution


    【解决方案1】:

    您可以使用 apache velocity 将带有键的字符串替换为带有值的等效字符串。

    【讨论】:

      【解决方案2】:

      您的担忧似乎是有道理的。 String 是不可变的,因此它会创建多个对象。您应该使用 StringBuilder 或 StringBuffer。

      我为你写了一个示例。从这里构建

      private static String substitute(String text) {
              List<Macro> macros = getMacros();
              StringBuffer st = new StringBuffer(text);
      
              for (Macro macro : macros) {
                  int start = st.indexOf(macro.getKey());
                  if (start != -1) {
                      st.replace(start, start + macro.getKey().length(), macro.getValue());
                  }
              }
              return st.toString();
          }
      

      干杯!!

      【讨论】:

      • 感谢您的提示。我会试试这个。
      【解决方案3】:

      如果您对性能有一些顾虑,可以使用 StringBuilder,它允许您将文本参数声明为 final:

      private String substitute(final String text) {
          List<Macro> macros = getMacros();
          StringBuilder stringBuilder=new StringBuilder(text);
          for(Macro macro: macros) {
              int index=stringBuilder.indexOf(macro.getKey());
              if (index!=-1) {
                  stringBuilder.replace(index, index+macro.getKey().length(), macro.getValue());
              }
          }
          return stringBuilder.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-15
        • 2016-09-10
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2020-08-31
        • 1970-01-01
        • 2021-06-13
        相关资源
        最近更新 更多