2013-10-11 14 views
2

我需要检查数百万个字符串的缩写并将其替换为完整版本。由于数据的原因,只能用逗号代替缩写。字符串可以包含多个缩写。有效检查子字符串并替换它们 - 我可以在此改进性能吗?

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

+0

因为你有数以百万计的字符串查找,一种方式可能是索引它们并做全文搜索以获取所有匹配缩写的地址(我假设地址查找是由于巨大的卷而不是替换的最慢部分) – harsh

+0

I'可以替代负载以提高查询的可靠性和速度。你说得对,我可以在加载所有行后分批进行。可能值得一试。 – tom

+0

不确定这是否可以提高性能,但不检查包含。只需更换。如果它不包含字符串,则不会发生任何事情。 – Averroes

回答

1

什么能真正提高性能是使用一个更好的数据结构比简单数组存储你的精简版。所有的shortForms都可以按缩写字母顺序排列。因此,您可以将查找时间从O(N)减少到更像二分查找的内容。

我以前没有使用过它,但也许是标准库的SortedMap符合该法案,而不是使用在所有的自定义对象的: http://docs.oracle.com/javase/7/docs/api/java/util/SortedMap.html

这里就是我想:

  • 认沽缩写/全字对映射到TreeMap中
  • 将地址标记为单词。
  • 检查每一个字,看它是否是树形图的关键
  • 更换它,如果它是
  • 把纠正令牌回到一起作为地址
+0

如何排序帮助?我需要检查他们。 – tom

+0

查看每一个将会快得多。现在需要循环600次来查看每个循环。在二进制搜索中,需要大约6次迭代循环。更好的部分是你不需要为此实现任何算法; TreeMap似乎是您需要的SortedMap的实现,它包含在Java标准库中。 – davecom

+0

举起我可能误解了你在做什么。我以为你是以相反的方式(检查文本中的每个单词是否在列表中存在缩写)。 – davecom

2

这会已经是快一点,如果你跳过部分:)

+0

我在猜测替换调用contains()。卫生署。好点。 – tom

1

我想我会跟这样做一个HashMap。关键是缩写,价值将是完整的术语。然后,只需搜索字符串以查找逗号,然后查看逗号前面的文本是否在字典中。您可能可以将一个字符串中的所有替换项映射到一个字符串中,然后再进行所有替换。

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

相关问题