tigrazone (tigrazone) wrote,
tigrazone
tigrazone

explode на delphi/pascal

unit xplode;
{$R-,X+,V-}

interface
type
TArray = array of string;

function explode(separator, str : string) : TArray;
function explode1(separator, str : string) : TArray;

var
lmax:cardinal;
Rezult:tarray;

implementation
uses StrUtils;

function explode;
var
len,l0,l1,mizer,pp : cardinal;
i   : cardinal;
begin
mizer:=1000;SetLength(Rezult,mizer);l0:=mizer;
pp:=pos(separator, str);
if (pp = 0) or (str = '') or (separator = '') then
begin
  SetLength(Rezult,1);
  Rezult[0] := str;
end
else
begin
  len := 1;l1:=len;
  while pp <> 0 do
  begin
    i := pp;
    while l1>mizer do
    begin
    l0:=l0+mizer;
    if lmax<l0 then begin lmax:=l0;SetLength(Result, l0);end;
    l1:=l1-mizer;
    end;

      Rezult[len - 1] := copy(str, 1, i - 1);
    delete(str, 1, i - 1 + length(separator));
    inc(len);
    pp:=pos(separator, str);
  end;

    Rezult[len - 1] := str;
    Result:=Rezult;
    SetLength(Result, len);
end;
end;

//ускоренная версия explode - без удаления части строки и лишних копирований
//используется функция posEx из модуля StrUtils

function explode1;
var
len,l0,l1,mizer,pp,ls,pp0, lstr : longint;

begin
mizer:=1000;SetLength(Rezult,mizer);l0:=mizer;
pp:=pos(separator, str);
lstr:=length(str);

     ls:=length(separator);

  if (pp = 0) or (lstr = 0) or (ls = 0) then
begin
  SetLength(Rezult,1);
  Rezult[0] := str;
end
else
begin
  len := 1;l1:=len;

     pp0:=1;

    while pp <> 0 do
  begin
    while l1>mizer do
    begin
        l0:=l0+mizer;
        if lmax<l0 then begin lmax:=l0;SetLength(Result, l0);end;
        l1:=l1-mizer;
      end;    

       
Rezult[len - 1] := copy(str, pp0, pp - pp0);    

       
inc(len);  

       
pp0:=pp+ls;        

       
pp:=posEx(separator, str, pp0);
    end;  

       
if pp0<lstr then
          Rezult[len - 1] := copy(str, pp0, lstr - pp0+ls);    

       
Result:=Rezult;
      SetLength(Result, len);
  end;
end;

initialization
lmax:=0;
{$R+,X-,V+}
end.


и программа для теста:


program explodes;
{$APPTYPE CONSOLE}
uses xplode, windows, SysUtils;

var arr:tarray;
   str:string;
i:longint;
ttt:single;
   Time: cardinal;

begin

   str:='one two three four five six seven eight nine ten eleven one two three four five six seven eight nine ten eleven one two three four five six seven eight nine ten eleven';

Time := GetTickCount;

for I := 1 to 1000000 do
     arr:=explode(' ',str);

ttt:=GetTickCount-Time;
          ttt:=ttt/1000;

writeln(
format('explode time %.2fs',
      [ttt
      ]
      )
);


Time := GetTickCount;

for I := 1 to 1000000 do
    arr:=explode1(' ',str);

ttt:=GetTickCount-Time;
        ttt:=ttt/1000;

writeln(
format('explode1 time %.2fs',
    [ttt
    ]
    )
);

end.



результат:

E:\prj\!15\explodes>explodes
explode time 6,49s
explode1 time 3,75s
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

  • 2 comments