![]() |
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; |
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 |
Re: StringReplace und doppelte Zeichen
Ja, da hat sich ein Tippfehler eingeschlichen;) Ist korrigiert.
|
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 |
Re: StringReplace und doppelte Zeichen
Ach, mist^^ Es sei dem geneigten Leser überlassen, das noch zu ändern :mrgreen: Auf mich wartet eine Matratze.. :angel:
|
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: |
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
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. ;) |
Re: StringReplace und doppelte Zeichen
zum Original-Code:
Delphi-Quellcode:
und hier mal was Kurzes (nicht sehr schnell, aber bestimmt schneller als'es Original, aber zumindestens ein schön kompakter Code)
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; schnell genug?
Delphi-Quellcode:
schneller:
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;
Delphi-Quellcode:
ein bissl Langsamer, aber so ginge es och noch:
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;
Delphi-Quellcode:
notfalls ließe sich dat Vorletzte noch leicht in ASM umwandeln.
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; |
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. |
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