假设有一个字符串:
"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)
它工作得很好,但很愚蠢和慢,任何人都有更明确的解决方案?
答案 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,那么它将是安全的,之后它将开始替换空格