AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

strings um ein bestimmtes zeichen vermindern

Ein Thema von Molzer · begonnen am 9. Jan 2009 · letzter Beitrag vom 9. Jan 2009
Antwort Antwort
Seite 2 von 2     12   
WInfo

Registriert seit: 3. Jan 2009
36 Beiträge
 
#11

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 13:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 13:21
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
WInfo

Registriert seit: 3. Jan 2009
36 Beiträge
 
#13

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 13:27
Moin Moin Sakura,

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

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 13:38
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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
WInfo

Registriert seit: 3. Jan 2009
36 Beiträge
 
#15

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 14:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 14:33
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 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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: strings um ein bestimmtes zeichen vermindern

  Alt 9. Jan 2009, 15:28
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz