一般来说, Split 功能主要是将一个字符串按特定的分隔符来分开成 Array,而 Join 功能就是将一个 Array 以特定的分隔符来隔开组成一个字符串,方便储存。
由于Delphi 的 Dynamic Array 功能比较弱而问题多多,所以很多时我们会以 StringList 来代替。
这里提供的就是将 String Split 成 StringList 的 FastSplit 函数和 将 StringList Join 成 String 的 FastJoin 函数。
其实,在 K.Top 网站之前已有网友Dalman提供过一个 _Split 函数,功能是一样的,亦看见有其它网友不断沿用这个函数,详情可见 :
http://delphi.ktop.com.tw/topic.asp?topic_id=21331
那为甚么还来发表这篇文章,难道是骗稿费?
第一,在这里发表没稿费的耶。
第二,原文没有相对的 Join 功能。
第三,_Split 功能比小弟的拙作 FastSplit 要耗用多 50% 的时间。
癈话少说,就看看这两个功能的程序代码罢 :
function FastSplit(const S : String; const Delimiter : String=',') : TStrings;
var
i,j : integer;
begin
result := TStringList.Create;
i := 1;
j := Pos(Delimiter,S);
While j > 0 do
begin
result.Add(Copy(S,i,j-i));
i := j + 1;
j := PosEx(Delimiter,S,i);
end;
result.Add(Copy(S,i,Length(S)));
end;
function FastJoin(SL : TStrings; const Delimiter : String=',') : String;
begin
result := StringReplace(SL.Text,#13#10,Delimiter,[rfReplaceAll]);
result := copy(result,1,length(result)-1);
end;
速度测试 :
Split 测试 :
将 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z' 用两个不同的 Split 函数拆开 10000 次。
FastSplit : 0.17 秒
_Split : 0.26 秒
wordwrap : 0.56 秒 (每个还剩','在尾部,若删除共要差不多2秒)
Join 测试 :
先将 Split 测试的结果放在 TMemo ,然后用 Memo.Lines 来给 Join 函数结合 10000 次。
FastJoin : 0.73 秒
老实说,我对 FastJoin 的速度并不满意,没理由结合比分拆慢那么多。我试过几个不同的做法:
像 FastJoin 那样用循环将每行的值加在一起 : 0.87 秒
用 SL.Delimiter 及 SL.DelimitedText : 1 秒多
各读者们又有没有更好的方法呢?希望你们能将你们更好的方法与我但一同分享。
注:速度会因应计算机不同而有所不冋,主要是对不同方法作比较之用。
此文章由 http://www.ositren.com 收集整理 ,地址为:
http://www.ositren.com/htmls/67958.html