Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#19

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 18:15
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.
$2B or not $2B
  Mit Zitat antworten Zitat