我需要检查数百万个字符串的缩写,并用完整版替换它们。由于数据,只应替换以逗号结尾的缩写。字符串可以包含多个缩写。
我有一个包含缩写 - > Fullversion对的查找表,它包含大约600对。
我目前的设置看起来像这样。在启动时,我使用Jackson从csv文件创建一个ShortForm实例列表,并将它们保存在一个单例中:
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对象,但我还能做什么呢?
====== 更新 更改代码以反过来工作。将字符串拆分为单词并检查集合以查看该字符串是否为缩写。
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!
答案 0 :(得分:2)
如果你跳过contains()
部分:)
答案 1 :(得分:1)
真正提高性能的是使用比简单数组更好的数据结构来存储ShortForms。所有短格式都可以按字母顺序按缩写存储。因此,您可以将查找时间从O(N)减少到更像二分查找的内容。
我之前没有使用它,但也许标准库的SortedMap符合要求而不是使用自定义对象: http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html
这就是我的想法:
答案 2 :(得分:1)
我想我会用HashMap做到这一点。关键是缩写,值将是完整的术语。然后只需在字符串中搜索逗号,然后查看逗号之前的文本是否在字典中。您可以在一次传递中将所有替换映射到单个字符串中,然后在此之后进行所有替换。
这使得每次查找O(1)总共进行O(n)次查找,其中n是找到的缩写的数量,我认为不太可能有更高效的方法。