Java字符串比较
我正在比较两个大文本文件中的子字符串。非常简单,标记为两个令牌容器,与2 for循环比较。 性能不堪设想!有没有人有建议或想法如何提高性能?Java字符串比较
for (int s = 0; s < txtA.TokenContainer.size(); s++) {
String strTxtA = txtA.getSubStr(s);
strLengthA = txtA.getNumToken(s);
if (strLengthA >= dp.getMinStrLength()) {
int tokenFileB = 1;
for (int t = 0; t < txtB.TokenContainer.size(); t++) {
String strTxtB = txtB.getSubStr(t);
strLengthB = txtB.getNumToken(t);
if (strTxtA.equalsIgnoreCase(strTxtB)) {
try {
subStrTemp = new SubStrTemp(
txtA.ID, txtB.ID, tokenFileA, tokenFileB,
(tokenFileA + strLengthA - 1),
(tokenFileB + strLengthB - 1));
if (subStrContainer.contains(subStrTemp) == false) {
subStrContainer.addElement(subStrTemp);
}
} catch (Exception ex) {
logger.error("error");
}
}
tokenFileB += strLengthB;
}
tokenFileA += strLengthA;
}
}
一般来说我的代码读取与Java Tokonizer两个大串入容器A和B.然后试图比较这些两个字符串现有存储到一个Vector Substrgs的substrings.Possision。但是性能很糟糕,也不知道如何用HashMap解决它。
谢谢Colin HEBERT,“嵌套” - >“for(){for(){}},”“嵌套” - >“for(){},for(){}”对不对?哈希映射我真的很害怕..从来没有代码编码过。因为我知道在HashMap中我必须使用HashSet,这里多余的标记会被删除!?好吧,我不需要他们,但我需要他们的职位。你能告诉我,如果我能用HashMap存储和检索令牌位置? – jackdaniels 2010-09-06 10:17:00
这是嵌套/不嵌套的。如果你想保留职位,你可以这样做'HashMap
呃......以为我实施了你的建议Colin。但不知何故无法获得Hashmap参数..你可以看看请问,编程代码在这里
您正在使用嵌套循环进行连接?是的,那是O(n^2)。那么做一个散列连接呢?也就是说,创建一个从(小写)strText
到t
的映射,并使用此映射进行查找,而不是遍历令牌容器?
Hello Meriton,谢谢您的帮助。是的,我做到了,但不想再做更多。性能也可以用小字符串,嵌套循环的另一个原因我可以存储strPositions(相同的子字符串)(几乎)排序在一个Vector中。 – jackdaniels 2010-09-06 10:46:30
是的,我已经得到了它没有办法绕过散列和映射..我必须学习它.. :-(你能告诉我,我该怎么做一个Java的HashJoin?没有找到任何Java相关的例子 - 特别是在谷歌HashJoin ...如果做HashJoin如何存储subStr-positons,这些都是必要存储。 – jackdaniels 2010-09-06 11:00:31
请告诉我,为什么它需要小写字符串?我怎样才能创建一个“从(小写) strText中以T“?这句话我真的不明白..谢谢提前。 请告诉我,还有,为什么它需要小写字符串?我怎样才能建立一个”从地图(小写)strText中来T“?这句话我真的没有承担.. – jackdaniels 2010-09-06 11:03:21
将fileA的令牌放入trie数据结构中。然后,在标记fileB时,您可以非常快速地检查这些标记是否在特里结构中。一些代码评论会有所帮助。
谢谢James,你会建议使用哪种数据结构? – jackdaniels 2010-09-06 10:21:01
更多评论,很高兴..我在java tokenizer的帮助下阅读txt文件到一个字符串中,然后试图在DocB中搜索DocA的子字符串。这样做2例。第一种情况substr-length是constat,第二种情况是substr-length不同,为此我添加了“if(strLengthA> = dp.getMinStrLength())”来减少非常短的子串的迭代次数。 – jackdaniels 2010-09-06 10:32:54
A Trie:http://en.wikipedia.org/wiki/Trie。 – James 2010-09-06 11:24:54
甲说,这是复杂的问题,你是算法运行在为O(n^2)而不是O(n)使用散列。
二阶改进,尽量少打电话向功能,例如你可以得到的大小,一旦
sizeB = txtB.TokenContainer.size();
的大小Depeneds,你可以调用容器一旦获得字符串保存getStr数组....
罗尼
感谢Roni,我不确定调用函数是否需要一些性能。但是,当然,特别是“txtB.TokenContainer.size();”程序每次调用n次,绝对不必要。 – jackdaniels 2010-09-06 09:59:12
你可以在口头上或与您的代码所做的例子说明? – 2010-09-05 20:23:02