Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   StringReplace und doppelte Zeichen (https://www.delphipraxis.net/105530-stringreplace-und-doppelte-zeichen.html)

Dax 23. Dez 2007 23:47

Re: StringReplace und doppelte Zeichen
 
Und der hier dürfte letztlich am schnellsten sein:
Delphi-Quellcode:
function ReduceMultiples(const s: string; c: char): string;
var i, pos: Integer;
begin
  SetLength(result, Length(s));
  pos := 1;
  for i := 1 to Length(s) do
  begin
    if (i = 1) or (result[pos-1] <> s[i]) then
    begin
      result[pos] := s[i];
      Inc(pos);
    end;
  end;
  SetLength(result, pos-1);
end;

Opa 24. Dez 2007 01:16

Re: StringReplace und doppelte Zeichen
 
S:='xxDasxxxxxLebenx ist schön';
@DAX
S:='xxDasxxxxxLebenx ist schönxx';
Caption := ReduceMultiples(S,'x');//Erg ='xxDasxxxxxLebenx ist schön' (geht nicht)
Der Name ist schön. Und schnell ist die function ggf. auch nur NICHT RICHTIG

@grenzgaenger
Caption := ReplaceDChar(S,'x'); //Erg OK, und sieht schöner aus. Bin mir nur nicht sicher ob sie schneller als meine ist
Und der Name ist auch besser.

Mfg

Dax 24. Dez 2007 01:33

Re: StringReplace und doppelte Zeichen
 
Ja, da hat sich ein Tippfehler eingeschlichen;) Ist korrigiert.

Opa 24. Dez 2007 02:10

Re: StringReplace und doppelte Zeichen
 
@ DAX
Immer noch richtig. C wird nicht genutzt. Du machst so alle doppelten Platt auch (z.B. ss) :wink:

MFG

Dax 24. Dez 2007 02:13

Re: StringReplace und doppelte Zeichen
 
Ach, mist^^ Es sei dem geneigten Leser überlassen, das noch zu ändern :mrgreen: Auf mich wartet eine Matratze.. :angel:

Opa 24. Dez 2007 02:19

Re: StringReplace und doppelte Zeichen
 
if (I = 1) or (Result[P-1] <> S[I]) or (Result[P-1] <>C)
So geht das ich gehe jetz auch ins Bett :mrgreen:

MFG
PS.: Kein Ergeiz, geht doch glatt Pennen. :corky:

Opa 24. Dez 2007 10:12

Re: StringReplace und doppelte Zeichen
 
Opa - 00-00-00-156 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-031 - Ich x bin x der x schnellste x Hase x der der Welt
----------------------------------------------------
Opa - 00-00-00-172 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-016 - Ich x bin x der x schnellste x Hase x der der Welt
----------------------------------------------------
Opa - 00-00-00-172 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-031 - Ich x bin x der x schnellste x Hase x der der Welt

DAX, deine ist wirklich die Schnellste, Respekt.
Meine kommt dann in die Tonne :zwinker:
MFG

DP-Maintenance 24. Dez 2007 10:50

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Tools rund um Delphi" nach "Neuen Beitrag zur Code-Library hinzufügen" verschoben.
Ich schiebe das nun hierhin. Es könnte für andere auch brauchbar sein.
Um ein Delphi-Tool geht es sowieso nicht. ;)

himitsu 24. Dez 2007 17:15

Re: StringReplace und doppelte Zeichen
 
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.

alzaimar 24. Dez 2007 18:07

Re: StringReplace und doppelte Zeichen
 
Hier
Delphi-Quellcode:
Function RemoveCharRepetitions(Const aText: String; aChar: Char): String;
Var
  i, j: Integer;
  c: Char;

Begin
  setLength(Result, Length(aText));
  If Length(aText)=0 Then Exit;
  j := 1;
  c := aText[1];
  Result[1] := c;
  For i := 2 To Length(aText) Do
    If aText[i] <> c Then Begin
      Inc(j);
      c := aText[i];
      Result[j] := c;
    End;
  SetLength(Result, j);
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz