0

在我看来,这似乎很简单……直到我坐下来开始打字。

无论如何,我的任务是编写一个方法,该方法将在字符串中找到“标签”,并适当地替换它们,输出结果字符串。函数声明看起来像:

public String doStuff(String source, Map<Integer, String> replacementData)

这个想法是每个“标签”将是一个被“<<>>”包围的整数值(所以正则表达式类似于“. <<[0-9]+>>. ”)。一旦在 中遇到这些标签之一source,我应该从标签中获取标签中包含的整数,并且应该通过替换标签replacementData.get(I)

无论如何,我想有效地做到这一点。我只是不知道该怎么做。我看了一下 Pattern and Matcher,我认为那不是正确的方法。我不想使用 String.indexOf 之类的东西,因为它效率低下(不是吗?)。

感谢您的建议!

4

2 回答 2

2

使用正则表达式模式和匹配器的方法是捕获所谓的组中的整数,然后用它来替换。问题的另一个有趣部分是逐步替换。您需要执行的步骤顺序在appendReplacement 方法的 javadoc 中进行了描述

示例代码:

String str = "abc<<1>>def<<2>>ghi";
java.util.Map<Integer,String> replacementMap = new java.util.HashMap<Integer,String>() {
    {
        put(1," ONE ");
        put(2," TWO ");
    }
};
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("<<([0-9]+)>>");
java.util.regex.Matcher matcher = pattern.matcher(str);
int start = 0;
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(sb,replacementMap.get(Integer.parseInt(matcher.group(1))));
}
matcher.appendTail(sb);
System.out.println(sb.toString());

输出:abc ONE def TWO ghi

于 2012-04-07T00:32:50.187 回答
0

天真的实现:

public String doStuff(String source, Map<Integer, String> replacementData){

    for( Map.Entry<Integer,String> entry : replacementData.entrySet() )
         source = source.replace("<<"+entry.getKey().toString()+">>", entry.getValue() );

    return source;
}

对我来说,它看起来并不太低效。使其更有效的唯一方法是尝试在一次遍历字符串中完成所有内容,但这实际上涉及重写String.replace().

考虑到将要投入的工作量,我会将这种优化归类为仅当分析器显示这是一个真正的瓶颈时才要做的事情。

Puneet的Matcher基于 - 的方法更好,因为它只传递字符串一次。

于 2012-04-07T00:04:32.030 回答