Zitat von
WInfo:
das SetLength wurde nun in der Routine angepasst. Jetzt sollte die Routine i.O. sein und hoffentlich keine grosse Performancebremse.
Jetzt meine Idee (ungetestet, sollte evtl. einen Tick schneller sein).
Delphi-Quellcode:
function RemoveDoubles(const str: string; const ch: Char = #32): string;
var
I, Cnt, Len: Integer;
CurrChar: Char;
LastWasChar: Boolean;
begin
Len := Length(str);
SetLength(Result, Len);
Cnt := 0;
LastWasChar := False;
for I := 1 to Len do
begin
CurrChar := str[I];
if CurrChar <> ch then
begin
Inc(Cnt);
Result[Cnt] := CurrChar;
LastWasChar := False;
continue;
end;
if LastWasChar then
continue;
Inc(Cnt);
Result[Cnt] := CurrChar;
LastWasChar := True;
end;
SetLength(Result, Cnt);
end;
Wichtig ist die CONST Deklaration für den eingehenden String, das spart ein try..finally-Block des Compilers. Des Weiteren sparen wir uns einige Array-Rechnungen durch das Cachen des aktuell zu verarbeitenden Zeichens, als auch durch das Lesen/Setzen eines Flags für den Vergleich des letzten kopierten Zeichens. Soweit mal meine Theorie. Testen kann wer anders
...
...