字符串的Split 功能和对应的 Join 功能

字体大小: 中小 标准 ->行高大小: 标准
一般来说, 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