论坛首页 入门技术论坛

在发1个spliter ,比jdk String的split速度快4倍。也更加稳定。

浏览 8362 次
该帖已经被评为新手帖
作者 正文
   发表时间: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@");
   发表时间: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
0 请登录后投票
   发表时间:2009-08-31   最后修改:2009-08-31
看起来好像是快了一些,但是稳定是如何看出的呢?
0 请登录后投票
   发表时间:2009-08-31   最后修改:2009-08-31
xiaoych 写道
看起来好像是快了一些,但是稳定是如何看出的呢?



稳定性是没有办法证明的,只能这样说,在无数次使用中没出现过问题,而在使用split抛异常这样的事情,也遇到过,目前这个spliter还没有发现过问题。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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函数。

0 请登录后投票
   发表时间: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年了,我忘了
1 请登录后投票
   发表时间:2009-08-31  
呵呵,我也没有其他意思,看到你代码,比较感兴趣,就也写了个!
要最底层封装只能通过字节流。
0 请登录后投票
   发表时间:2009-08-31  
用StringTokenizer
0 请登录后投票
   发表时间:2009-08-31  
fyf_008 写道
xiaoych 写道
看起来好像是快了一些,但是稳定是如何看出的呢?



稳定性是没有办法证明的,只能这样说,在无数次使用中没出现过问题,而在使用split抛异常这样的事情,也遇到过,目前这个spliter还没有发现过问题。


同学,不够严谨喔,我就是看到你标题的“也更加稳定”才进来看的。
我还以为JDK的有啥问题呢...
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics