我需要检查数百万个字符串的缩写并将其替换为完整版本。由于数据的原因,只能用逗号代替缩写。字符串可以包含多个缩写。有效检查子字符串并替换它们 - 我可以在此改进性能吗?
我有一个包含缩写 - > Fullversion对的查找表,它包含大约600对。
我目前的设置看起来像这样。在启动时,我使用杰克逊从一个CSV文件中创建简短实例的列表,并把它们在一个单:
public static class ShortForm{
public String fullword;
public String abbreviation;
}
List<ShortForm> shortForms = new ArrayList<ShortForm>();
//csv code ommited
和使用该名单
for (ShortForm f: shortForms){
if (address.contains(f.abbreviation+","))
address = address.replace(f.abbreviation+",", f.fullword+",");
}
现在这个工程的一些代码,但它是慢。有什么方法可以加快速度?第一步是用逗号加载ShortForm对象,但我还能做什么?
====== UPDATE 更改后的代码以相反的方式工作。将字符串拆分为单词并检查一组以查看该字符串是否为缩写。
StringBuilder fullFormed = new StringBuilder();
for (String s: Splitter.on(" ").split(add)){
if (shortFormMap.containsKey(s))
fullFormed.append(shortFormMap.get(s));
else
fullFormed.append(s);
fullFormed.append(" ");
}
return fullFormed.toString().trim();
测试显示这比原来的方法快13倍以上。干杯davecom!
因为你有数以百万计的字符串查找,一种方式可能是索引它们并做全文搜索以获取所有匹配缩写的地址(我假设地址查找是由于巨大的卷而不是替换的最慢部分) – harsh
I'可以替代负载以提高查询的可靠性和速度。你说得对,我可以在加载所有行后分批进行。可能值得一试。 – tom
不确定这是否可以提高性能,但不检查包含。只需更换。如果它不包含字符串,则不会发生任何事情。 – Averroes