Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Schnellstes Entfernen von Chars aus einem String? (https://www.delphipraxis.net/184473-schnellstes-entfernen-von-chars-aus-einem-string.html)

PeterPanino 29. Mär 2015 15:19

Schnellstes Entfernen von Chars aus einem String?
 
Hallo! Was ist die SCHNELLSTE Methode, um aus einem String alle Zeichen eines anderen Strings zu entfernen? Also z.B.:

Delphi-Quellcode:
function RemoveCharsFromString(const AStr, CharsToRemove: string): string;

mkinzler 29. Mär 2015 15:26

AW: Schnellstes Entfernen von Chars aus einem String?
 
Ich habe keinen Vergleich, aber ich würde mal Testen, ob StringReplace() schnell genug ist.

Popov 29. Mär 2015 15:36

AW: Schnellstes Entfernen von Chars aus einem String?
 
StringReplace wurde immer ein Zeichen ersetzen. Man müsste es somit für jeden Zeichen wiederholen (was auch keine Arbeit wäre).

Ansonsten aus dem Kopf:
Delphi-Quellcode:
function RemoveCharsFromString(const AStr, CharsToRemove: string): string;
var
  i: Integer;
begin
  Result := AStr;
  for i := Length(Result) downto 0 do
    if Pos(Result[i], CharsToRemove) > 0 then
    //if Pos(AnsiUpperCase(Result[i]), AnsiUpperCase(CharsToRemove)) > 0 then
      Delete(Result, i, 1);
end;

mkinzler 29. Mär 2015 15:42

AW: Schnellstes Entfernen von Chars aus einem String?
 
Nein, man kann der Funktion auch Sagen, dass sie alle Vorkommnisse erseten soll.
(rfReplaceAll in Flags)

mm1256 29. Mär 2015 15:44

AW: Schnellstes Entfernen von Chars aus einem String?
 
Zitat:

Zitat von Popov (Beitrag 1295256)
StringReplace wurde immer ein Zeichen ersetzen. Man müsste es somit für jeden Zeichen wiederholen (was auch keine Arbeit wäre).

Ansonsten aus dem Kopf:
Delphi-Quellcode:
function RemoveCharsFromString(const AStr, CharsToRemove: string): string;
var
  i: Integer;
begin
  Result := AStr;
  for i := Length(Result) downto 0 do
    if Pos(Result[i], CharsToRemove) > 0 then
    //if Pos(AnsiUpperCase(Result[i]), AnsiUpperCase(CharsToRemove)) > 0 then
      Delete(Result, i, 1);
end;

Müsste man mal testen, was schneller wäre...auch aus dem Kopf und ungetestet:
Delphi-Quellcode:
function RemoveCharsFromString(const AStr, CharsToRemove: string): string;
var
  i,p: integer;
  ch: char;
begin
  Result := AStr;
  for i := 1 to Length(CharsToRemove) do begin
    p := Pos(CharsToRemove[i],Result);
    if p > 0 then
    repeat
      Delete(Result,p,1);
      p := Pos(CharsToRemove[i],Result);
    until P = 0;
  end;
end;

Zacherl 29. Mär 2015 15:53

AW: Schnellstes Entfernen von Chars aus einem String?
 
Zitat:

Zitat von mkinzler (Beitrag 1295257)
Nein, man kann der Funktion auch Sagen, dass sie alle Vorkommnisse erseten soll.
(rfReplaceAll in Flags)

Ja, alle Vorkommen des Such-Strings. Der Threadersteller will aber glaube ich jedes Zeichen im CharToRemove String entfernen.

Popov 29. Mär 2015 15:55

AW: Schnellstes Entfernen von Chars aus einem String?
 
So wie ich den TE verstanden habe hat er z. B. den Text "Hallo große Welt!" und möchte nun alle l und e entfernen, so das "Hao groß Wt!" rauskommt. Ich mag mich irren, denn ich hab StringReplace schon lange nicht genutzt. Also mit rfReplaceAll werden alle l in einem Vorgang entfert, aber nicht auch e. Für e müsste man einen zweiten Durchlauf machen. In etwa so:

Delphi-Quellcode:
function RemoveCharsFromString(const AStr, CharsToRemove: string): string;
var
  i: Integer;
begin
  Result := AStr;
  for i := 1 to Length(CharsToRemove) do
    Result := StringReplace(Result, CharsToRemove[i], '', [rfReplaceAll, rfIgnoreCase]);
end;
(dieses Mal nicht aus dem Kopf ;) )

mkinzler 29. Mär 2015 15:58

AW: Schnellstes Entfernen von Chars aus einem String?
 
Wenn man einen höheren IQ als ich hat, könnte man das aus der Frage herauslesen, aber "einfach gestrickte Typen" wie ich, haben den feinen Kniff glatt überlesen. :oops:

Zacherl 29. Mär 2015 16:12

AW: Schnellstes Entfernen von Chars aus einem String?
 
Erster Versuch, der DEUTLICH schneller ist, als alle anderen bisher geposteten Lösungen:
Delphi-Quellcode:
function RemoveCharsFromString(const AStr: String; CharsToRemove: TSysCharSet): string;
var
  I, J: Integer;
begin
  SetLength(Result, Length(AStr));
  J := 1;
  for I := 1 to Length(AStr) do
  begin
    if (not (AStr[I] in CharsToRemove)) then
    begin
      Result[J] := AStr[I];
      J := J + 1;
    end;
  end;
  SetLength(Result, J - 1);
end;
Getestet mit einem 256KiB großen Zufallsstring (bestehend aus 'a'..'z') und CharsToRemove mit 'a' und 'z':
Code:
mm1256  :  656ms
Popov   : 1359ms
Zacherl1:    0ms

Neumann 29. Mär 2015 16:20

AW: Schnellstes Entfernen von Chars aus einem String?
 
Warum so kompliziert, einfach mal die Beschreibung von SysUtils.StringReplace lesen

So wie ich das verstehe, ersetzt diese einen Teilstring durch einen neuen, nicht einzelne Zeichen.

Also braucht man nur diese aufrufen mit RepaceAll und fertig. Wenn der Strig nicht Megabites gross ist sehe ich auch keine Notwendigkeit, über die Geschwindigkeit nachzudenken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr.
Seite 1 von 7  1 23     Letzte »    

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