zum Original-Code:
Delphi-Quellcode:
function EntferneDoppelZeichen(
Const S:
String; C: Char):
String;
var
i : integer;
begin
Result := '
';
i := Length(S);
repeat
if S[i] = C
then
while (i > 1)
and (S[i - 1] = C)
do // erst Wertebereich für i prüfen
begin // und dann auf S zugreifen
dec(I);
if i < 2
then break;
// i und nicht 1
end;
//Result := S[i] + Result;
Insert(S, S[i], 1);
dec(i);
until i < 1;
end;
und hier mal was Kurzes (nicht sehr schnell, aber bestimmt schneller als'es Original, aber zumindestens ein schön kompakter Code)
schnell genug?
Delphi-Quellcode:
function EntferneDoppelZeichen(Const S: String; C: Char): String;
var
i : integer;
begin
Result := S;
for i := Length(S) downto 2 do
if (S[i] = C) and (S[i - 1] = C) then
Delete(S, i, 1);
end;
schneller:
Delphi-Quellcode:
Function ReduceMultiples(
Const S:
String; C: Char):
String;
Var Pi, Po,
Pe: PChar;
Cm: Char;
Begin
Result := S;
If Result = '
'
Then Exit;
Pi := @Result[1];
Pe := Pi + Length(Result);
Inc(Pi);
Po := Pi;
Cm := Result[1];
While Pi <
Pe do Begin
If (Pi^ <> Cm)
or (Pi^ <> C)
Then Begin
Inc(Po);
Cm := Pi^;
End;
Inc(Pi);
Po^ := Pi^;
End;
SetLength(Result, Po - @Result[1] + 1);
End;
ein bissl Langsamer, aber so ginge es och noch:
Delphi-Quellcode:
Function ReduceMultiples(
Const S:
String; C: Char):
String;
Var Pi, Po,
Pe: PChar;
Begin
Result := S;
If Result = '
'
Then Exit;
Pi := @Result[1];
Pe := Pi + Length(Result);
Inc(Pi);
Po := Pi;
While Pi <
Pe do Begin
If (Pi^ <> (Po - 1)^)
or (Pi^ <> C)
Then Inc(Po);
Inc(Pi);
Po^ := Pi^;
End;
SetLength(Result, Po - @Result[1] + 1);
End;
notfalls ließe sich dat Vorletzte noch leicht in
ASM umwandeln.