Zitat von
grenzgaenger:
tja, war wohl nicht ganz so gut ... mit dem goto ...
Kommt auf die Testdaten an. Wenn die zu eliminierenden Doubletten nicht ganz vorne stehen, bringt das schon etwas.
Da hier mal wieder Pointerarithmetik schneller zu sein scheint als Indizierung eines Strings (beim FastPos-Projekt ist es grad anders herum) habe ich meine Variante mal mit Pointern implementiert. Das wird -bei mir- doppelt so schnell. Kann eigentlich nicht sein, aber es scheint zu funktionieren... Ich erzeuge einen String der Länge 10000 mit zufälligen Zeichen aus ABCD und kürze 'A' weg.
Delphi-Quellcode:
Function RemoveCharRepetitionsP(
Const aText:
String; aChar: Char):
String;
Var
ip, jp, ep: PChar;
c: Char;
Begin
setLength(Result, Length(aText));
If Length(aText) = 0
Then Exit;
ip := @aText[1];
jp := @Result[1];
c :=
ip^;
ep :=
ip+Length (aText);
Result[1] := c;
inc(
ip);
while ip<ep
do begin
If (c <> aChar)
Or (
ip^ <> c)
Then Begin
Inc(jp);
c :=
ip^;
jp^:=c;
End;
inc (
ip);
End;
SetLength(Result, jp-@Result[1]+1);
End;