字符串查找算法
假设我现在拼接出了像
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);
======================================
你自己找找。我也不太会。不过用正则保证能算出来。