Delphi-PRAXiS
Seite 2 von 7     12 34     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)

BadenPower 29. Mär 2015 16:29

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

Zitat von Neumann (Beitrag 1295263)
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.

Er will aber nicht nur Teilstrings ersetzten, sondern in StringA jedes Zeichen, welches in StringB vorkommt.

DeddyH 29. Mär 2015 16:30

AW: Schnellstes Entfernen von Chars aus einem String?
 
Wie schnell ist denn diese Variante im Vergleich?
Delphi-Quellcode:
function RemoveCharsFromString(const AStr: string; CharsToRemove: TSysCharSet): string;
var
  PSrc, PDest, PCurrent: PChar;
begin
  SetLength(Result, Length(AStr));
  PSrc := PChar(AStr);
  PDest := PChar(Result);
  PCurrent := PDest;
  while PSrc^ <> #0 do
    begin
      {$IFDEF UNICODE}
      if not CharInSet(PSrc^, CharsToRemove) then
      {$ELSE}
      if not(PSrc^ in CharsToRemove) then
      {$ENDIF}
        begin
          PCurrent^ := PSrc^;
          PCurrent := CharNext(PCurrent);
        end;
      PSrc := CharNext(PSrc);
    end;
  SetString(Result, PDest, PCurrent - PDest);
end;

mm1256 29. Mär 2015 16:30

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

Zitat von Zacherl (Beitrag 1295262)

Getestet mit einem 256KiB großen Zufallsstring (bestehend aus 'a'..'z') und CharsToRemove mit 'a' und 'z':
Code:
mm1256  :  656ms
Popov   : 1359ms
Zacherl1:    0ms

Soeben auch verglichen...es kommt aber in Zacherl's Ergebnis nicht das selbe raus. Suche noch, woran es liegt

EDIT: So funktionierts tatsächlich am schnellsten:

Delphi-Quellcode:
function RemoveCharsFromString(const AStr, CharsToRemove: string): string;
var
  i: Integer;
  S: set of Char;
begin
  s := [];
  for i := 1 to Length(CharsToRemove)
  do S := S + [CharsToRemove[i]];
  Result := '';
  for i := 1 to Length(AStr) do
  if not CharInSet(AStr[i],S)
  then Result := Result + AStr[i];
end;
Und das Ergebnis stimmt auch ;-)

EDIT-2

ooops...Deddy's Variante ist noch schneller. 1 MB Text mit 3 Ersetzungen dauert nur ein paar Ticks....geil ;-)

Zacherl 29. Mär 2015 16:55

AW: Schnellstes Entfernen von Chars aus einem String?
 
Hatte noch nen SetLength am Ende vergessen und mir ist wohl ein -1 bei der Schleife reingerutscht. So funktioniert es und ist sogar noch schneller als DeddyHs Version:
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;
100MiB String mit 2 Ersetzungen:
Code:
Zacherl : 641
DeddyH : 1578

PeterPanino 29. Mär 2015 16:57

AW: Schnellstes Entfernen von Chars aus einem String?
 
Ich war jetzt im Hintergrund dauernd am Testen, und immer wenn ich eine Antwort schreiben wollte, ist mir ein anderer zuvor gekommen.

DeddyHs Variante ist tatsächlich bei weitem die schnellste, die StringReplace-Variante die mit Abstand langsamste. Bei DeddyH muss man natürlich vorher noch das Charset erstellen.

EDIT: Revidiere mich. Die letzte Variante von Zacherl ist tatsächlich am schnellsten: 10000 Durchgänge in 0,003 Sekunden bei 10 Zeichen langen Strings! Fantastisch!

himitsu 29. Mär 2015 17:05

AW: Schnellstes Entfernen von Chars aus einem String?
 
StringReplace ist nicht das Schnellste, aber sehr einfach.

Außerdem wurden ein paar Fakten vergessen, denn solche Dinge hängen vom Kontext ab.
* Wie lang sind die Strings?
* Was für Zeichen sollen entfernt werden?
* Wieviele Zeichen sollen entfernt werden, so durchschnittlich in Prozenz?
* Was ist schnell? (wie schnell , bzw. oft soll das gemacht werden)
* ...

Uwe Raabe 29. Mär 2015 17:22

AW: Schnellstes Entfernen von Chars aus einem String?
 
Die Variante mit dem
Delphi-Quellcode:
TSysCharSet
funktioniert allerdings nur für AnsiChar (
Delphi-Quellcode:
TSysCharSet = set of AnsiChar
) bzw. bei NextGen-Compilern für Zeichen deren Ordnungszahl im Bereich 0..255 liegt.

PeterPanino 29. Mär 2015 17:23

AW: Schnellstes Entfernen von Chars aus einem String?
 
Danke an alle fürs Mitmachen!

Amateurprofi 29. Mär 2015 18:00

AW: Schnellstes Entfernen von Chars aus einem String?
 
Hier meine Version, die besonders bei längeren Strings recht flott arbeitet.

Zu einigen anderen Vorschlägen die auf TSysCharSet basieren.

Ich finde, die Vorschläge gehen an der Fragestellung vorbei, denn es war ja nicht gefragt,
Zeichen zu entfernen, die in einem TSysCharSet enthalten sind, sondern Zeichen, die
in einem anderen String enthalten sind.

In dem Zusammenhang :
Was macht ihr, wenn Zeichen zu entfernen sind, die keine Ansizeichen sind z.B. '√'

Delphi-Quellcode:
FUNCTION RemoveChars(const S,Remove:String):String;
type
   TBA=Array[Char] of Boolean;
   TPBA=^TBA;
var P:TPBA; I,J:Integer; C:Char;
begin
   P:=AllocMem(SizeOf(TBA));
   for I:=1 to Length(Remove) do P[Remove[I]]:=True;
   SetLength(Result,Length(S));
   J:=0;
   for I:=1 to Length(S) do begin
      C:=S[I];
      if not P[C] then begin
         Inc(J);
         Result[J]:=C;
      end;
   end;
   SetLength(Result,J);
   FreeMem(P);
end;

PeterPanino 29. Mär 2015 18:28

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

Zitat von Amateurprofi (Beitrag 1295273)
Was macht ihr, wenn Zeichen zu entfernen sind, die keine Ansizeichen sind z.B. '√'

set of Char verwenden?

Die Frage ist aber auch: Wieso ist das Nachsehen in einem Char Set schneller als Pos?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.
Seite 2 von 7     12 34     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