求快速分割字符串的函数

beelet 2014-02-24 03:36:04
加精
本人现抛砖引玉,贴一段代码。
private static String[] SplitTextAll(String line,String splitText)
{
int position1 = line.indexOf(splitText);

int length = splitText.length();
List<String> arr = new ArrayList<String>();

int positionstart = - length;
int positionend = position1;

while (positionend>=0)
{
positionend = line.indexOf(splitText, positionstart + length);
if(positionend==-1)
{
break;
}

arr.add(line.substring(positionstart + length, positionend));
positionstart = positionend;

}
arr.add(line.substring(positionstart + length));
return arr.toArray(new String[arr.size()]);

}
当前代码鲁棒性还有待提高。权当献丑,上面代码速度是JDK6自带split的4-5倍。求速度更快的代码。现程序的瓶颈在字符分割,谢谢!
...全文
3392 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸥翔鱼游1 2014-04-29
  • 打赏
  • 举报
回复
看帖是学习,回帖是礼貌。。。
beelet 2014-03-05
  • 打赏
  • 举报
回复
自己顶一下帖子
yyfhz 2014-02-28
  • 打赏
  • 举报
回复
29L 的第4种方法看不懂,好像根本就没有拆分嘛。
AckerKwok 2014-02-27
  • 打赏
  • 举报
回复
别闹腰不好 2014-02-27
  • 打赏
  • 举报
回复
用电子表测试的1!
javasleep 2014-02-27
  • 打赏
  • 举报
回复
String orgStr = “西安酷派;酷云分享”; 1. 最原始的字符串分割 long startTime1 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { orgStr.split(";"); } long endTime1 = System.currentTimeMillis(); System.out.println("split processTime:" + (endTime1 – startTime1)); 2. 使用效率较高的StringUtils字符串分割 long startTime2 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { StringUtils.split(orgStr, ";"); } long endTime2 = System.currentTimeMillis(); System.out.println("StringUtils.split processTime:" + (endTime2 – startTime2)); 3. 使用效率更高的StringTokenizer类分割字符串 long startTime3 = System.currentTimeMillis(); StringTokenizer st = new StringTokenizer(orgStr, ";"); for (int i = 0; i < 1000000; i++) { while (stringTokenizer.hasMoreTokens()) { st.nextToken(); } st= new StringTokenizer(orgStr, ";"); } long endTime3 = System.currentTimeMillis(); System.out.println("StringTokenizer processtime = " + (endTime3 - startTime3)); 4. 更优化的字符串分割方式 long startTime4 = System.currentTimeMillis(); String tmp = orgStr; for (int i = 0; i < 1000000; i++) { while (true) { String splitStr = null; int j = orgStr.indexOf(';'); if (j <0 ) { break; } } } long endTime4 = System.currentTimeMillis(); System.out.println("indexOf processtime = " + (endTime4 - startTime4)); 结果对比: split processTime:2500 StringUtils.split processTime:547 StringTokenizer processtime = 531 indexOf processtime = 15
twtiqfn 2014-02-26
  • 打赏
  • 举报
回复
感觉不错的,加油
beelet 2014-02-25
  • 打赏
  • 举报
回复
引用 18 楼 ldh911 的回复:
[quote=引用 16 楼 beelet 的回复:] 匹配模式串目前最长是4个字符
那么这四个字符是可以明确固定下来?还是经常变化的?[/quote] 可以明确固定下来
  • 打赏
  • 举报
回复
hwx5400145 2014-02-25
  • 打赏
  • 举报
回复
我没测试过可能改进过一些参数了,
sundaytian 2014-02-24
  • 打赏
  • 举报
回复
看了楼主的代码 感觉自愧不如啊
C8974596581 2014-02-24
  • 打赏
  • 举报
回复
看了楼主的代码 感觉自愧不如啊
MiceRice 2014-02-24
  • 打赏
  • 举报
回复
引用 16 楼 beelet 的回复:
匹配模式串目前最长是4个字符
那么这四个字符是可以明确固定下来?还是经常变化的?
beelet 2014-02-24
  • 打赏
  • 举报
回复
引用 14 楼 ldh911 的回复:
[quote=引用 12 楼 beelet 的回复:] 所以求助帮忙,求优化。
先问问你的应用场景,你是以下哪种?因为用途越专一,可优化性能越高。 ◎ 只需要按特定字符匹配分割,比如"a,b,c"中的逗号(,)就够了,那么这个可以用 String.split(char c),性能并不差; ◎ 需要按特定几个字符匹配分割,比如"a,b;c d.e"中的逗号、分号、空格和句号,那么这个没有现成的,不过自己写个split直接用switch来进行查找性能也很高; ◎ 需要按特定的字符串匹配分割,比如"aa123bb123cc"中的特征串“123”来进行分割。 从你实现的代码来看,应该是第三种。 那么indexOf的查找性能是不够高的(尤其是如果你的模式串123很长的情况下),可以去Google下匹配算法:KMP 或 Sunny (后者性能更高),用来做连续匹配查找的性能(尤其是在匹配模式串很长的情况下)是比较好的;当然这种算法要做预处理的,也就是会先对匹配模式串进行预计算,所以不要重复创建匹配计算对象。 嗯?你说你的匹配模式串很短很短?那恐怕优化空间就不高了,楼主你那段代码差不多可以了。[/quote] 匹配模式串目前最长是4个字符
beelet 2014-02-24
  • 打赏
  • 举报
回复
要分解的字符串是类似日志文件,字符串包含IP,URI,Time等。程序运行在Linux(Centos)上
MiceRice 2014-02-24
  • 打赏
  • 举报
回复
引用 12 楼 beelet 的回复:
所以求助帮忙,求优化。
先问问你的应用场景,你是以下哪种?因为用途越专一,可优化性能越高。 ◎ 只需要按特定字符匹配分割,比如"a,b,c"中的逗号(,)就够了,那么这个可以用 String.split(char c),性能并不差; ◎ 需要按特定几个字符匹配分割,比如"a,b;c d.e"中的逗号、分号、空格和句号,那么这个没有现成的,不过自己写个split直接用switch来进行查找性能也很高; ◎ 需要按特定的字符串匹配分割,比如"aa123bb123cc"中的特征串“123”来进行分割。 从你实现的代码来看,应该是第三种。 那么indexOf的查找性能是不够高的(尤其是如果你的模式串123很长的情况下),可以去Google下匹配算法:KMP 或 Sunny (后者性能更高),用来做连续匹配查找的性能(尤其是在匹配模式串很长的情况下)是比较好的;当然这种算法要做预处理的,也就是会先对匹配模式串进行预计算,所以不要重复创建匹配计算对象。 嗯?你说你的匹配模式串很短很短?那恐怕优化空间就不高了,楼主你那段代码差不多可以了。
tony4geek 2014-02-24
  • 打赏
  • 举报
回复
看环境和需求。查找的东西不一样。
beelet 2014-02-24
  • 打赏
  • 举报
回复
引用 11 楼 ldh911 的回复:
楼主需要的只是按特定字符进行分隔,而JDK自带的是正则分隔,性能高是必然的。 不过看楼主这代码,优化空间应该还是不低的。
所以求助帮忙,求优化。
MiceRice 2014-02-24
  • 打赏
  • 举报
回复
楼主需要的只是按特定字符进行分隔,而JDK自带的是正则分隔,性能高是必然的。 不过看楼主这代码,优化空间应该还是不低的。
sunbo624 2014-02-24
  • 打赏
  • 举报
回复
JDK最大的问题 就是没提供一个split(str, separator, false);方法 不匹配正则 我也认为 带上正则 太难受 大部分代码是用不上的
加载更多回复(9)

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧