![]() |
Doppelte Zeichen in einem String finden/löschen
Guten Abend :)
Ich habe versucht, eine Funktion zu entwerfen, die jedes Zeichen in einem String mit jedem anderen vergleicht und falls ein Zeichen mehrfach auftaucht, alle bis auf das vorne stehende Zeichen zu löschen. Als Beispiel: Aus REGENSCHIRMSTAENDER müsste REGNSCHIMTAD werden. Allerdings löscht er bei mir alle Zeichen die 3 mal oder öfter vorkommen komplett, so dass RGNSCHIMTAD entsteht.
Delphi-Quellcode:
Sieht jemand den Fehler? :?
function DeleteChar(s: string): string;
var i,j,n: integer; begin n:=length(s); j:=n-1; i:=0; for i:=0 to n do begin for j:=0 to n do begin if ((s[i] = s[j]) and (i <> j)) then begin delete(s, j, 1); dec(n); end; end; end; Gruß Liu |
Re: Doppelte Zeichen in einem String finden/löschen
Strings beginnen bei Index 1 und ich würde einmal überprüfen, ob das dec(n) wirklich Einfluss auf die Laufvariablen hat (Debugger).
P.S.: Willkommen in der DP :dp: |
Re: Doppelte Zeichen in einem String finden/löschen
Bei For-Schleifen merkt sich Delphi das Ende.
Also n wird zu Beginn zwischengespeichert und dann nicht nochmals neu ausgewertet. Daraum macht man For-Schleifen rückwärst, wenn man darin was löscht. |
Re: Doppelte Zeichen in einem String finden/löschen
Alternativvorschlag (nicht großartig getestet):
Delphi-Quellcode:
function DeleteDoubleChars(const s: string): string;
var iStart, iEnd: integer; begin iStart := 1; Result := s; while iStart <= Length(Result) do begin iEnd := Length(Result); while iEnd > iStart do begin if Result[iEnd] = Result[iStart] then Delete(Result,iEnd,1); Dec(iEnd); end; Inc(iStart); end; end; |
Re: Doppelte Zeichen in einem String finden/löschen
Delphi-Quellcode:
function DeleteChar(const s: AnsiString): AnsiString;
var u: set of AnsiChar; i: integer; begin result := s; u := []; i := 1; while i <= Length(result) do if result[i] in u then delete(result, i, 1) else begin Include(u, result[i]); Inc(i); end; end;
Delphi-Quellcode:
die Ersten sind schneller, gehen aber nur für AnsiStrings (also für String bis Delphi 2007)
function DeleteChar(const s: AnsiString): AnsiString;
var u: set of AnsiChar; i: integer; begin result := ''; u := []; for i := 1 to Length(s) do if not (s[i] in u) then begin Include(u, s[i]); result := result + s[i]; end; end;
Delphi-Quellcode:
und das entspricht deinem.
function DeleteChar(const s: string): string;
var i, j: integer; begin result := s; i := 1; while i <= Length(result) do for j := 1 to i - 1 do begin if result[i] = result[j] then Delete(result, i, 1) end else Inc(i); end; end; wobei in While- und Repeat-Schleifen in jedem Durchgang die Ausstiegsbedingung neu bewertet wird. |
Re: Doppelte Zeichen in einem String finden/löschen
@himi: Wieso löschst Du aus s und nicht aus Result?
[edit] Hatter selbst gemerkt :lol: [/edit] |
Re: Doppelte Zeichen in einem String finden/löschen
Hallo
vergleiche mal hiermit:
Delphi-Quellcode:
Viele Grüße und Erfolg, sowie gutes Gelingen
unit frmMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; Edit2: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var CL : TStringList; I : Integer; S : String; begin CL := TStringList.Create; try for I := 1 to Length(Edit1.Text) do if CL.IndexOf(Edit1.Text[I]) = -1 then CL.Add(Edit1.Text[I]); for I := 0 to CL.Count - 1 do S := S + CL.Strings[I]; Edit2.Text := S; finally CL.Free; end; end; end. wünscht Alter Mann PS die 'anderen' waren schneller, trozdem für's Vertsändnis. |
Re: Doppelte Zeichen in einem String finden/löschen
Vielen Dank an Alle für die schnellen Antworten. Es funktioniert jetzt :-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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 by Thomas Breitkreuz