有效地检查子串并替换它们 - 我可以在这里提高性能吗?

时间:2013-10-11 08:06:37

标签: java

我需要检查数百万个字符串的缩写,并用完整版替换它们。由于数据,只应替换以逗号结尾的缩写。字符串可以包含多个缩写。

我有一个包含缩写 - > 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!

3 个答案:

答案 0 :(得分:2)

如果你跳过contains()部分:)

,那已经快一点了

答案 1 :(得分:1)

真正提高性能的是使用比简单数组更好的数据结构来存储ShortForms。所有短格式都可以按字母顺序按缩写存储。因此,您可以将查找时间从O(N)减少到更像二分查找的内容。

我之前没有使用它,但也许标准库的SortedMap符合要求而不是使用自定义对象: http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html

这就是我的想法:

  • 将缩写/全字对放入TreeMap
  • 将地址标记为单词。
  • 检查每个单词以查看它是否是TreeMap中的键
  • 如果
  • ,请将其替换
  • 将更正后的标记重新组合在一起作为地址

答案 2 :(得分:1)

我想我会用HashMap做到这一点。关键是缩写,值将是完整的术语。然后只需在字符串中搜索逗号,然后查看逗号之前的文本是否在字典中。您可以在一次传递中将所有替换映射到单个字符串中,然后在此之后进行所有替换。

这使得每次查找O(1)总共进行O(n)次查找,其中n是找到的缩写的数量,我认为不太可能有更高效的方法。