Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Doppelte Zeichen löschen (https://www.delphipraxis.net/45679-doppelte-zeichen-loeschen.html)

Pseudemys Nelsoni 10. Mai 2005 16:03


Doppelte Zeichen löschen
 
Moin,

Nehmen wir mal an ich habe folgenden String:

Zitat:

...blah...blubb..irgendwas..
und ich möchte eine Funktion schreiben, die doppelte "." löscht und die aussen auch...wie könnte ich das _schnellst_möglich machen?

Also das es nachher so aussieht:

Zitat:

blah.blubb.irgendwas
Ich hatte es schon so:

Delphi-Quellcode:
function FmtTok(const S: string; const C: Char): string;
var
  B: Boolean;
  I: Integer;
  ResLen: Integer;
begin
  Result := '';
  if S <> '' then
  begin
    B := True;
    for I := 1 to Length(S) do
    begin
      if (S[I] <> C) or ((S[I] = C) and (not B)) then
        Result := Result + S[I];
      B := S[I] = C;
    end;
    ResLen := Length(Result);
    if Result[ResLen] = C then
      SetLength(Result, ResLen-1);
  end;
end;
Das funktioniert auch, aber ich möchte es optimieren. Das "Result := Result + S[I];" dürfte wohl den langsamsten Teil ausmachen... Wie könnte ich das ganzen nun mit PChars hinkriegen?

Ich habs so versucht (*g*):

Delphi-Quellcode:
function FmtTok(const S: string; const C: Char): string;
var
  SPtr, ResPtr: PChar;
  SI: Integer;
  B: Boolean;
begin
  SetLength(Result, Length(S));
  if S <> '' then
  begin
    SPtr := @S[1];
    ResPtr := @Result[1];
    SI := 1;
    B := True;
    while SPtr <> #0 do
    begin
      if (SPtr^ <> C) or ((SPtr^ = C) and (not B)) then
      begin
        ResPtr := SPtr;
        Inc(ResPtr);
      end;
      B := SPtr^ = C;
      Inc(SI);
      Inc(SPtr);
    end;
    if ResPtr^ = C then
      SetLength(Result, Length(Result)-1)
    else SetLength(Result, Length(Result));
  end;
end;
Nicht schimpfen! Das ist erst mein erster Versuch mit PChars zu arbeiten! *g*

Naja der Code(letzterer) funktioniert nicht, gibt ewig Exceptions... jemand ne Idee was verkehrt ist? =[

alcaeus 10. Mai 2005 16:06

Re: Doppelte Zeichen löschen
 
Hallo Pseudemys Nelsoni,

fuer Strings kannst du ja Delphi-Referenz durchsuchenStringReplace mit dem Delphi-Referenz durchsuchenrfReplaceAll-Flag verwenden:
Delphi-Quellcode:
SomeVar := StringReplace('..', '.', SomeVar, [rfReplaceAll]);
kA ob die Parameterreihenfolge stimmt ;)

Greetz
alcaeus

Pseudemys Nelsoni 10. Mai 2005 16:10

Re: Doppelte Zeichen löschen
 
hallo alcaeus,

erstmal danke für deine Antwort ;)

Aber wie gesagt:

Delphi-Quellcode:
_schnellst_möglich
Mit StringReplace wäre die Funktion gleich 10 mal langsamer als meine Ausgangsfunktion. Ich möchte es ja optimieren und nicht verkleinern ;)

Wie gesagt meine obige Funktion geht, die untere nicht.

Dax 10. Mai 2005 16:17

Re: Doppelte Zeichen löschen
 
Ich würde es wohl eher so machen:
Delphi-Quellcode:
function FmtTok(const S: string; const C: Char): string;
var
  ResP, SP, OrgRes: PChar;
begin
  SetLength(Result, Length(S));
  if S <> '' then
  begin
    SP := @S[1];
    ResP := @Result[1];
    OrgRes := ResP;
    while SP^ <> #0 do
    begin
      if (ResP^ <> C) or (SP^ <> C) or ((ResP^ <> C) and (SP^ = C)) then
      begin
        if ResP^ = C then
          Inc(ResP);
        ResP^ := SP^;
      end;
      if (SP^ <> C) then
        Inc(ResP);
      Inc(SP);
    end;
    SetLength(Result, StrLen(OrgRes));
  end;
end;
Ungetestet ;)

Edit: Jetzt gehts hoffentlich.. ja, es geht

Pseudemys Nelsoni 10. Mai 2005 16:21

Re: Doppelte Zeichen löschen
 
Hallo Dax,

das löscht aber alle Punkte.

Ich weiss ja nicht ob du mein Editiertes nich gelesen hast ;)
Aber aus:

Zitat:

...blah...blubb..irgendwas..
sollte:

Zitat:

blah.blubb.irgendwas

werden.

Hast du da ne Idee?

Dax 10. Mai 2005 16:23

Re: Doppelte Zeichen löschen
 
:oops: Sorry.. war wohl ein wenig übereifrig, Moment. Steht gleich oben - hoffentlich korrekt ;-)

marabu 10. Mai 2005 16:40

Re: Doppelte Zeichen löschen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Man muss nicht unbedingt mit PChar arbeiten um schnell zu sein.

Grüße vom marabu

Nachtrag: Eine Routine zum Komprimieren eines speziellen Zeichens.

Pseudemys Nelsoni 10. Mai 2005 16:40

Re: Doppelte Zeichen löschen
 
Moin moin Dax,

danke für deine Mühe :)

Hast du noch ne Idee wie ich die beiden Punkte aussen wegbekomme?

Zitat:

und die aussen auch
:mrgreen:

ich wüsste nicht wie ich das mit einbringen könnte, aber ich denke ich würds verstehen wenn ichs sehe


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:05 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