该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-31
最后修改:2009-08-31
String str="aaa[@space@]bbb[@space@]ccc[@space@]ddd[@space@][@space@][@space@]eee[@space@]"; List<String> list=com.fyf.string.common.Spliter.cut(str, "[@space@]"); for(String s: list){ System.out.println(s); } 控制台输出: aaa bbb ccc ddd eee 后面会证明它比jdk的速度快的多,尽管是返回了ArrayList, 这个方法是将[@space@]作为间隔,链接在一起的间隔算一个,不计算其中的空字符串, 这个很多地方有用,和split方法不一致 String[] arr=str.split("[@space@]"); for(String s:arr){ System.out.println(s); } 加入上面的代码,你看到后台的输出不正常,是这样的 [ ]bbb[ ] [ ]ddd[ ][ ][ ] [ ] 其实并不是String的split有问题,她里面的参数是一个正这表达式,儿造成了他速度的降低。 这样就发现对了。 str.split("@space@"); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-31
速度方面,运行下面的代码 String str="abcde111abcde2222abcde3333abcde4444abcde5555"; com.fyf.string.common.Spliter.cut(str, "abcde"); List<String> list=null; long d=System.currentTimeMillis(); for(int i=0;i<999999;++i) { list=com.fyf.string.common.Spliter.cut(str, "abcde"); } System.out.println(System.currentTimeMillis()-d); String [] arr=null; long t=System.currentTimeMillis(); for(int i=0;i<999999;++i) { arr=str.split("abcde"); } System.out.println(System.currentTimeMillis()-t); 结果: 687 3859 |
|
返回顶楼 | |
发表时间:2009-08-31
最后修改:2009-08-31
看起来好像是快了一些,但是稳定是如何看出的呢?
|
|
返回顶楼 | |
发表时间:2009-08-31
最后修改:2009-08-31
xiaoych 写道 看起来好像是快了一些,但是稳定是如何看出的呢?
稳定性是没有办法证明的,只能这样说,在无数次使用中没出现过问题,而在使用split抛异常这样的事情,也遇到过,目前这个spliter还没有发现过问题。 |
|
返回顶楼 | |
发表时间:2009-08-31
大哥,我只能对你说:
你太慢了!(王小龙说!) ----------------------------------------------------- import java.util.*; public class Main { com.fyf.string.common.Spliter s=new com.fyf.string.common.Spliter(); public static void main(String[] asdf){ String str="abcde111abcde2222abcde3333abcde4444abcde5555"; com.fyf.string.common.Spliter.cut(str, "[a-z]"); List<String> list=null; long d=System.currentTimeMillis(); for(int i=0;i<999999;++i) { list=com.fyf.string.common.Spliter.cut(str, "abcde"); } System.out.println(System.currentTimeMillis()-d); String [] arr=null; long t=System.currentTimeMillis(); for(int i=0;i<999999;++i) { arr=str.split("abcde"); } System.out.println(System.currentTimeMillis()-t); long k=System.currentTimeMillis(); for(int i=0;i<999999;++i) { List<String> listT=split(str,"abcde"); } System.out.println(System.currentTimeMillis()-k); } public static List<String> split(String str,String s){ //劈开方法 List<String> list=new ArrayList<String>(); int begin=0; int end=0; int length=s.length(); while(true){ end=str.indexOf(s); String tmp=""; if (end>=0) tmp=str.substring(begin,end); else {tmp=str;break;} str=str.substring(begin+s.length()+tmp.length(),str.length()); list.add(tmp); } return list; } } --------------------------------------------- 这个我稍微写了下的spilt(String,String)方法,执行就比你的快4倍 1625 1956 485 |
|
返回顶楼 | |
发表时间:2009-08-31
最后修改:2009-08-31
pujia12345 写道 大哥,我只能对你说:
你太慢了!(王小龙说!) ----------------------------------------------------- import java.util.*; public class Main { com.fyf.string.common.Spliter s=new com.fyf.string.common.Spliter(); public static void main(String[] asdf){ String str="abcde111abcde2222abcde3333abcde4444abcde5555"; com.fyf.string.common.Spliter.cut(str, "[a-z]"); List<String> list=null; long d=System.currentTimeMillis(); for(int i=0;i<999999;++i) { list=com.fyf.string.common.Spliter.cut(str, "abcde"); } System.out.println(System.currentTimeMillis()-d); String [] arr=null; long t=System.currentTimeMillis(); for(int i=0;i<999999;++i) { arr=str.split("abcde"); } System.out.println(System.currentTimeMillis()-t); long k=System.currentTimeMillis(); for(int i=0;i<999999;++i) { List<String> listT=split(str,"abcde"); } System.out.println(System.currentTimeMillis()-k); } public static List<String> split(String str,String s){ //劈开方法 List<String> list=new ArrayList<String>(); int begin=0; int end=0; int length=s.length(); while(true){ end=str.indexOf(s); String tmp=""; if (end>=0) tmp=str.substring(begin,end); else {tmp=str;break;} str=str.substring(begin+s.length()+tmp.length(),str.length()); list.add(tmp); } return list; } } --------------------------------------------- 这个我稍微写了下的spilt(String,String)方法,执行就比你的快4倍 1625 1956 485 我copy了你的代码, 703 3813 640 我这个已近够底层,不可能被快4倍,是你的电脑cpu速度不稳定。 并且你list里面的5555已经漏掉了,, 我这个函数里面没有借助jdk的indexof,完全是自己的算法,你只是包装了jdk的substring和indexof 而且有错误。。splist这样的函数,原理一样的,你省去了,很多判断,比如,str==null,所以速度稍微快意点, 我给出的意义不是这个东西实现困难,而是split很有用,spliter里面有cutBySpace(String str), 将空格, 换行,/t ,/r等字符视为间隔。 还有cutByteArray(byte[] str,byte[]token) 用于剪切流读到得字节,就是byte版的split函数。 |
|
返回顶楼 | |
发表时间:2009-08-31
最后修改:2009-08-31
public static List<String> cut(String str,String token) { if(str==null||token==null){ throw new java.lang.IllegalArgumentException("所有参数不能为null ! str="+str+" : token="+token); } int len=str.length();int tLen=token.length(); if(tLen==0){ throw new java.lang.IllegalArgumentException("token长度不能为0 !"); } if(len<tLen||(len==tLen&&!str.equals(token))) { List<String> list=new ArrayList<String>(); list.add(str); return list; } if(str.equals(token)){ return new ArrayList<String>(); } List<String> cuts=new ArrayList<String>(); int bg=0;int end=0; for(int i=0;i<=len-tLen;i++) { if(str.charAt(i)==token.charAt(0)) { boolean isToken=true; for(int k=1;k<token.length();k++) { if(str.charAt(i+k)!=token.charAt(k)){ isToken=false;break; } } if(isToken) { end=i; String tem=str.substring(bg,end); if(tem.length()>0){ cuts.add(tem); } bg=end+tLen;end=bg; i+=tLen-1; } } } if(bg<len){ cuts.add(str.substring(bg,len)); } return cuts; } 我还是用了,substring。。没想到。。不好意思,写了3年了,我忘了 |
|
返回顶楼 | |
发表时间:2009-08-31
呵呵,我也没有其他意思,看到你代码,比较感兴趣,就也写了个!
要最底层封装只能通过字节流。 |
|
返回顶楼 | |
发表时间:2009-08-31
用StringTokenizer
|
|
返回顶楼 | |
发表时间:2009-08-31
fyf_008 写道 xiaoych 写道 看起来好像是快了一些,但是稳定是如何看出的呢?
稳定性是没有办法证明的,只能这样说,在无数次使用中没出现过问题,而在使用split抛异常这样的事情,也遇到过,目前这个spliter还没有发现过问题。 同学,不够严谨喔,我就是看到你标题的“也更加稳定”才进来看的。 我还以为JDK的有啥问题呢... |
|
返回顶楼 | |