Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alle anderen Zeichen außer a-z entfernen! (https://www.delphipraxis.net/54437-alle-anderen-zeichen-ausser-z-entfernen.html)

Kidix 4. Okt 2005 13:08


Alle anderen Zeichen außer a-z entfernen!
 
Hi,

ich habe einen String der in etwa so aussehen kann

Zitat:

screenshot$%&$%&||
Jetzt möchte ich, dass nur zeichen des Alphab. im strig stehen bleiben dürfen.
Wie mache ich das am besten?

zecke 4. Okt 2005 13:10

Re: Alle anderen Zeichen außer a-z entfernen!
 
:hi:

Sieht der String immer in der Form aus? Also fängt er mit dem relevanten Teil an oder kann der relevante Teil auch mitten in lustigen Zeichen stehen?

sakura 4. Okt 2005 13:11

Re: Alle anderen Zeichen außer a-z entfernen!
 
Mal so aus dem Blauen heraus:
Delphi-Quellcode:
function StripToLetters(const InStr: string): string;
var
  I, Cnt: Integer;
begin
  SetLength(Result, Length(InStr));
  Cnt := 0;
  for I := 1 to Length(InStr) do
  begin
    if InStr[I] in ['A'..'Z', 'a'..'z'] then
    begin
      Inc(Cnt);
      Result[Cnt] := InStr[I];
    end;
  end;
  SetLength(Result, Cnt);
end;
...:cat:...

r2c2 4. Okt 2005 13:31

Re: Alle anderen Zeichen außer a-z entfernen!
 
Zitat:

Zitat von sakura
Mal so aus dem Blauen heraus:
Delphi-Quellcode:
function StripToLetters(const InStr: string): string;
var
  I, Cnt: Integer;
begin
  SetLength(Result, Length(InStr));
  Cnt := 0;
  for I := 1 to Length(InStr) do
  begin
    if InStr[I] in ['A'..'Z', 'a'..'z'] then
    begin
      Inc(Cnt);
      Result[Cnt] := InStr[I];
    end;
  end;
  SetLength(Result, Cnt);
end;

Warum machst du das so kompliziert? Gibts irgend n Grund mit SetLength zu arbeiten?

Ich würde das einfach so machen:
Delphi-Quellcode:
function StripToLetters(const InStr: string): string;
var
  i: Integer;
begin
  for i := 1 to Length(InStr) do
  begin
    if InStr[i] in ['A'..'Z', 'a'..'z'] then
    begin
      Result := Result + InStr[i];
    end;
  end;
end;
Welchen Vorteil hätte nun deine Methode?

mfg

Christian

sakura 4. Okt 2005 13:33

Re: Alle anderen Zeichen außer a-z entfernen!
 
Zitat:

Zitat von r2c2
Welchen Vorteil hätte nun deine Methode?

Mache mal einen Performancetest. Entweder ein 2 MB String oder einfach einen relativ kurzen nehmen und den 10000 mal bearbeiten lassen. Dann wirst Du es merken :mrgreen:

...:cat:...

r2c2 4. Okt 2005 13:47

Re: Alle anderen Zeichen außer a-z entfernen!
 
Zitat:

Zitat von sakura
Zitat:

Zitat von r2c2
Welchen Vorteil hätte nun deine Methode?

Mache mal einen Performancetest. Entweder ein 2 MB String oder einfach einen relativ kurzen nehmen und den 10000 mal bearbeiten lassen. Dann wirst Du es merken :mrgreen:

Gut, werd ich machen. Sowas interessiert. Ich nehme mal an, das hängt damit zusammen, dass n string n dynamischer Array is und, dass + InStr[i] immer wieder implizit SetLength benutzt. Is das so?

mfg

Christian

sakura 4. Okt 2005 13:50

Re: Alle anderen Zeichen außer a-z entfernen!
 
Zitat:

Zitat von r2c2
Gut, werd ich machen. Sowas interessiert. Ich nehme mal an, das hängt damit zusammen, dass n string n dynamischer Array is und, dass + InStr[i] immer wieder implizit SetLength benutzt. Is das so?

So oder sehr ähnlich, ja :zwinker: Durch das stete Verlängern des Strings wird immer wieder ein neuer Speicherbereich alloziert und die Daten kopiert :shock:

Bei kleinen Datenmengen ist es gehupft wie gesprungen, aber bei großen... :zwinker:

...:cat:...

Sharky 4. Okt 2005 14:54

Re: Alle anderen Zeichen außer a-z entfernen!
 
Hai ihr,

nur mal so als vergleichswert:

Delphi-Quellcode:
begin
  for ndx := 1 to 1000 do
  begin
    s := s + 'A';
  end;
end;

function StripToLetters(const InStr: string): string;
var
  I, Cnt: Integer;
begin
  SetLength(Result, Length(InStr));
  Cnt := 0;
  for I := 1 to Length(InStr) do
  begin
    if InStr[I] in ['A'..'Z', 'a'..'z'] then
    begin
      Inc(Cnt);
      Result[Cnt] := InStr[I];
    end;
  end;
  SetLength(Result, Cnt);
end;

function StripToLetters2(const InStr: string): string;
var
  i: Integer;
begin
  for i := 1 to Length(InStr) do
  begin
    if InStr[i] in ['A'..'Z', 'a'..'z'] then
    begin
      Result := Result + InStr[i];
    end;
  end;
end;

procedure TForm1.btn_Test1Click(Sender: TObject);
var
  start : Cardinal;
  ende : Cardinal;
  foo : string;
  ndx : integer;
begin
  start := GetTickCount;
  for ndx := 1 to 1000 do
    foo := StripToLetters(s);
  ende := GetTickCount;
  lbl_Label1.Caption := Format('Zeit %d',[ende-start]);

  start := GetTickCount;
  for ndx := 1 to 1000 do
    foo := StripToLetters2(s);
  ende := GetTickCount;
  lbl_Label2.Caption := Format('Zeit %d',[ende-start]);
end;
Bei Funktion1 : 1 ms
Bei Funktion2 : 2200 ms

sakura 4. Okt 2005 15:00

Re: Alle anderen Zeichen außer a-z entfernen!
 
Zitat:

Zitat von Sharky
Bei Funktion1 : 1 ms
Bei Funktion2 : 2200 ms

Cool, gell :mrgreen: Ändere mal den TestString-Generator zu
Delphi-Quellcode:
begin
  Randomize;
  for ndx := 1 to 1000 do
  begin
    s := s + Chr(Random(Ord('z')-32)+32);
  end;
end;
Damit ist der String etwas verteilter und das Ergebnis "ehrlicher".

...:cat:...

Sharky 4. Okt 2005 20:15

Re: Alle anderen Zeichen außer a-z entfernen!
 
Zitat:

Zitat von sakura
...Damit ist der String etwas verteilter und das Ergebnis "ehrlicher". ...

Das interessiert mich jetzt aber:

Was ist es für ein Unterschied wie der String der Untersucht werden soll zusammengesetzt wurde?

BTW: In meinen Tests fehlt noch die Zeitmessung bei der Funktion von r2c2 wenn eine etxtra "foobar" Variable verwendet wird und deren Inhalt am Ende "an Result" übergeben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.
Seite 1 von 2  1 2      

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