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 in einem String finden/löschen (https://www.delphipraxis.net/142960-doppelte-zeichen-einem-string-finden-loeschen.html)

Liu 6. Nov 2009 19:22


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:
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;
Sieht jemand den Fehler? :?


Gruß

Liu

DeddyH 6. Nov 2009 19:30

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:

himitsu 6. Nov 2009 19:35

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.

DeddyH 6. Nov 2009 19:40

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;

himitsu 6. Nov 2009 19:47

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:
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;
die Ersten sind schneller, gehen aber nur für AnsiStrings (also für String bis Delphi 2007)
Delphi-Quellcode:
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;
und das entspricht deinem.

wobei in While- und Repeat-Schleifen in jedem Durchgang die Ausstiegsbedingung neu bewertet wird.

DeddyH 6. Nov 2009 19:49

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]

Alter Mann 6. Nov 2009 19:50

Re: Doppelte Zeichen in einem String finden/löschen
 
Hallo

vergleiche mal hiermit:
Delphi-Quellcode:
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.
Viele Grüße und Erfolg, sowie gutes Gelingen

wünscht


Alter Mann

PS die 'anderen' waren schneller, trozdem für's Vertsändnis.

Liu 6. Nov 2009 19:59

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:45 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