Hallo,
coole Sache, dass ihr mit vielen Leuten das Projekt angegangen seid, ne Funktion zu optimieren.
Ich wollte sie auch mal testen, um sie ggf. einzusetzen. Allerdings hab ich dabei (jedenfalls in meinem Fall) festgestellt, dass ich bereits ne schnellere Variante hatte (was mich angesichts eures Engagements bzgl. des Projekts etwas verwundert hatte).
Aber ehe ich hier irgendwie falsch liege, möchte ich euch bitten, meine Variante doch auch mal zu testen (sie arbeitet allerdings auf array of string und nicht mit einer StringList). Je nach Ergebnis eurer Tests könnt ihr mich sehr gerne korrigieren oder eben meine Variante einbauen.
Das soll jetzt nicht irgendwie eure Arbeit in Frage stellen, bitte nicht falsch verstehen. Ich wundere mich ja selbst über das Ergebnis meines Tests.
Delphi-Quellcode:
function explode(const n,s : string) : TStringDynArray;
var temp : array of integer;
Len : integer;
x, count, laenge : integer;
function follows(const s,n : string; pos1 : integer) : boolean;
var x : integer;
begin
{if pos1 + length(n) > length(s)+1 then
begin
result := false;
exit;
end;}
for x := 0 to length(n)-1 do
if n[x+1] <> s[pos1 + x] then
begin
result := false;
exit;
end;
result := true;
end;
begin
x := 1;
//SetLength(temp, 1);
SetLength(temp, 20);
count := 1;
temp[0] := 1;
laenge := Length(s) - Length(n) + 1;
while x <= laenge do
begin
if follows(s,n,x) then
begin
inc(x, length(n));
//SetLength(temp, length(temp)+1);
inc(count);
if length(temp) < count then
SetLength(temp, count + 20);
//temp[high(temp)] := x;
temp[count-1] := x;
continue;
end;
inc(x);
end;
SetLength(temp, count);
SetLength(result, length(temp));
for x := 0 to High(temp)-1 do
begin
Len := temp[x+1]-temp[x]-length(n);
result[x] := copy(s, temp[x], Len);
end;
Len := length(s)-temp[high(temp)]+1;
result[high(temp)] := copy(s, temp[high(temp)], Len);
end;
n ist das Pattern, s der große String.
Ich hab das getestet mit folgender Datei im Anhang, hab sie 8x hintereinander in einen String reingetan (damit es auch wirklich viele Daten sind) und dann mit verschiedenen Patterns (#10, ' ', '0') getestet.
Gruß
Michael