日期:2014-05-20  浏览次数:20825 次

字符串查找算法
假设我现在拼接出了像

23756563&3000343&truetrue@23756564&3000343&truetrue@23756563&3000343&truefalse@....(500万个类似短串,以@符号分隔)

这样的长串,保存在StringBuilder中。
需要知道 "23756583&3000343&truetrue@" 有没有在长串中出现过,有没有比 StringBuilder.indexOf()更有效率的方法?

------解决方案--------------------
StringBuffer 继承的OBJECT 所以就自己那几个方法...
------解决方案--------------------
可以使用正则表达式,但不知道效率是否高
------解决方案--------------------
自己写个二叉树的算法跟Stringbuffer里的方法比较一下 看看哪个效率高
------解决方案--------------------
str.split("23756583&3000343&truetrue@");
你试试以23756583&3000343&truetrue@来分割字符串,
然后判断得到的数组长度如果大于1说明有这个字符串,
否则就是不包含这个字符串,没有进行分割
------解决方案--------------------
用@将其分隔成字符串数组。
然后,for循环查找23756583&3000343&truetrue。注意已经没有@了。
不过500万,有点可怕啊...
------解决方案--------------------
我赌 StringBuffer 高
------解决方案--------------------
方法是有的,但是首先你不能先拼成StringBuffer,这样会导致堆内存溢出

给你个提示,使用字符串的hashCode,压缩字符串长度,使用int基本类型来存储,以减少内存占用。

------解决方案--------------------
500万个,要好多内存啊~
StringBuilder在构造的时候会对数据做一份copy吧
另外,从JDK目录下的src中看到的String.indexOf算法,是最低效的那种,时间复杂度O(m*n),不知道package里的字符串查找是否就是src里的代码
------解决方案--------------------
import java.util.regex.Pattern
import java.util.regex.Matcher

用正则表达式

String line = 23756563&3000343&truetrue@23756564&3000343&truetrue@23756563&3000343&truefalse@....

Pattern p = Pattern.compile("23756583&3000343&truetrue@");
Matcher m = p.matches(line);


======================================
你自己找找。我也不太会。不过用正则保证能算出来。