避免在字符串上进行递归替换

时间:2013-05-06 01:52:25

标签: java string replace

假设有一个字符串:

"I'm a boy."

和一些同义词(键值格式):

boy -> "male yong"
yong -> "age under 18"

如果我用同义词逐个替换字符串,它将是:

第1步,找到单词“boy”并替换它:"I'm a male young." 第2步,找到单词“young”并替换它:"I'm a male age under 18." 实际上我不需要递归替换,我只需要替换原始字符串,换句话说,第2步应该在原始字符串中找到“年轻”:“我是个男孩。”不是“我是男性年轻人”。有一个简单的解决方案:

首先将键替换为%s并将同义词添加到列表中:

string: "I'm a %s"
list: "male yong"

然后使用list:

格式化字符串
String.format(string, list)

它工作得很好,但很愚蠢和慢,任何人都有更明确的解决方案?

2 个答案:

答案 0 :(得分:1)

伪代码(未测试和函数名称可能有误):

String[] arr = sentence.Split(" ");
StringBuilder sb = new StringBuilder(); //can specify size for better results possibly

for (String s :arr ){
   if ( dic.contains(s) ){
       sb.append(dic.get(s));
   }else{
       sb.append(s);
   }
}

sb.toString();//your replaced string

我不确定string.format在内部做什么,但它可能会做类似的事情所以我怀疑你会得到性能提升。

答案 1 :(得分:0)

此解决方案与您的解决方案类似,但它不使用String.format

    String s = "I'm a yong boy.";
    Map<String, String> map = new HashMap<>();
    map.put("boy", "male yong");
    map.put("yong", "age under 18");
    // replace all keys with 1 char placeholders 
    int i = 0;
    for (String key : map.keySet()) {
        s = s.replace(key, "" + (char) i++);
    }
    // replace placeholders with values
    int j = 0;
    for (String v : map.values()) {
        s = s.replace("" + (char) j++, v);
    }
    System.out.println(s);

输出

I'm a age under 18 male yong.

如果我们使用StringBuilder进行替换,速度可以提高,但代码会更长。如果替换号码小于31,那么它将是安全的,之后它将开始替换空格

相关问题