Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi strings um ein bestimmtes zeichen vermindern (https://www.delphipraxis.net/127219-strings-um-ein-bestimmtes-zeichen-vermindern.html)

WInfo 9. Jan 2009 13:18

Re: strings um ein bestimmtes zeichen vermindern
 
Moin Moin, ein Wettbewerb? Dann möcht ich auch eine Routine zum besten geben 8)
Delphi-Quellcode:
 
  FUNCTION TrimDublicateSpaces(aString: string): string;
  VAR
    i, j: integer;
  BEGIN
    SetLength(Result, length(aString));
    j := 0;
    FOR i := 1 TO length(aString) DO
      IF aString[i] <> ' ' THEN
      BEGIN
        Inc(j);
        Result[j] := aString[i];
      END
      ELSE
        IF (j = 0) or (Result[j] <> aString[i]) THEN
        BEGIN
          Inc(j);
          Result[j] := aString[i];
        END;
    SetLength(Result, j);
  END;
//Edit: SetLength nach Hinweis Sakura angepasst.

sakura 9. Jan 2009 13:21

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von WInfo
SetLength(Result, length(aString) * sizeof(char));

Bei SetLength ist das SizeOf(Char) falsch! SetLength arbeitet immer mit der Elementgröße (bei Strings also SizeOf(Char)). In Delphi 2009 würde Dein Result-string einfach zu lang sein.

...:cat:...

WInfo 9. Jan 2009 13:27

Re: strings um ein bestimmtes zeichen vermindern
 
Moin Moin Sakura,

das SetLength wurde nun in der Routine angepasst. Jetzt sollte die Routine i.O. sein und hoffentlich keine grosse Performancebremse.

sakura 9. Jan 2009 13:38

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von WInfo
das SetLength wurde nun in der Routine angepasst. Jetzt sollte die Routine i.O. sein und hoffentlich keine grosse Performancebremse.

:)

Jetzt meine Idee (ungetestet, sollte evtl. einen Tick schneller sein).
Delphi-Quellcode:
function RemoveDoubles(const str: string; const ch: Char = #32): string;
var
  I, Cnt, Len: Integer;
  CurrChar: Char;
  LastWasChar: Boolean;
begin
  Len := Length(str);
  SetLength(Result, Len);
  Cnt := 0;
  LastWasChar := False;
  for I := 1 to Len do
  begin
    CurrChar := str[I];
    if CurrChar <> ch then
    begin
      Inc(Cnt);
      Result[Cnt] := CurrChar;
      LastWasChar := False;
      continue;
    end;
    if LastWasChar then
      continue;
    Inc(Cnt);
    Result[Cnt] := CurrChar;
    LastWasChar := True;
  end;
  SetLength(Result, Cnt);
end;
Wichtig ist die CONST Deklaration für den eingehenden String, das spart ein try..finally-Block des Compilers. Des Weiteren sparen wir uns einige Array-Rechnungen durch das Cachen des aktuell zu verarbeitenden Zeichens, als auch durch das Lesen/Setzen eines Flags für den Vergleich des letzten kopierten Zeichens. Soweit mal meine Theorie. Testen kann wer anders ;)

...:cat:...

WInfo 9. Jan 2009 14:06

Re: strings um ein bestimmtes zeichen vermindern
 
Moin Moin Sakura,

hast Recht, habe auch noch das Const angefügt und das brachte 1,47% Geschwindigkeitsvorteil, Deine Routine ist dagegen noch einmal um 3,71% schneller. Das bringt also schon einiges die Werte zwischenzuspeichern, das hätte ich gar nicht gedacht.

sakura 9. Jan 2009 14:33

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von WInfo
Moin Moin Sakura,

hast Recht, habe auch noch das Const angefügt und das brachte 1,47% Geschwindigkeitsvorteil, Deine Routine ist dagegen noch einmal um 3,71% schneller. Das bringt also schon einiges die Werte zwischenzuspeichern, das hätte ich gar nicht gedacht.

Danke für die Auswertung :mrgreen: Jetzt stellt sich nur die Frage, wie diese Methode eingesetzt werden soll. Selten in einer GUI Anwendung - wenn interessieren da selbst 100% bei einer Methode, welche i.A. in wenigen Millisekunden ausgeführt wird. Oder richtig hart auf einem Webserver mit tausenden von Anwendern, dann wird es richtig interessant :zwinker:

...:cat:...

alzaimar 9. Jan 2009 15:28

Re: strings um ein bestimmtes zeichen vermindern
 
Zitat:

Zitat von Klaus01
@alzaimar
Dein Lösung zählt nicht die Anzahl der Leerzeichen wenn mehr als 1 Leerzeichen
hintereinander folgen.

Absolut korrekt. Wer lesen kann, ist klar im Vorteil. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.
Seite 2 von 2     12   

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