![]() |
AW: Schnellstes Entfernen von Chars aus einem String?
Zitat:
|
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; |
AW: Schnellstes Entfernen von Chars aus einem String?
Zitat:
EDIT: So funktionierts tatsächlich am schnellsten:
Delphi-Quellcode:
Und das Ergebnis stimmt auch ;-)
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; EDIT-2 ooops...Deddy's Variante ist noch schneller. 1 MB Text mit 3 Ersetzungen dauert nur ein paar Ticks....geil ;-) |
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:
100MiB String mit 2 Ersetzungen:
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;
Code:
Zacherl : 641
DeddyH : 1578 |
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! |
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) * ... |
AW: Schnellstes Entfernen von Chars aus einem String?
Die Variante mit dem
Delphi-Quellcode:
funktioniert allerdings nur für AnsiChar (
TSysCharSet
Delphi-Quellcode:
) bzw. bei NextGen-Compilern für Zeichen deren Ordnungszahl im Bereich 0..255 liegt.
TSysCharSet = set of AnsiChar
|
AW: Schnellstes Entfernen von Chars aus einem String?
Danke an alle fürs Mitmachen!
|
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; |
AW: Schnellstes Entfernen von Chars aus einem String?
Zitat:
Die Frage ist aber auch: Wieso ist das Nachsehen in einem Char Set schneller als Pos? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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-2025 by Thomas Breitkreuz