【问题标题】: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;
}
- 这是在文本字符串中替换多个宏变量的好方法吗?这会在每个循环上创建一个新的 String 对象,所以我想知道是否有更好的方法来做到这一点。理想情况下,我会使用 Apache Commons
StrSubstitutor 类,但我不能因为令牌/宏的格式(不同的格式,而不是固定前缀/后缀之间)。由于性能问题,我也不想使用正则表达式。
-
根据工作中的一些编码规则,我需要将参数标记为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();
}