![]() |
Re: StringReplace und doppelte Zeichen
aChar wird bei dir aber auch nicht verwendet :stupid:
|
Re: StringReplace und doppelte Zeichen
der code von DAX ist schneller, weil er die länge des strings zu anfang setzt, bei meinen aktuellen code, wird bei jeden hinzufügen eines zeichens der speicher umgeschichtet. das kannst auf zweierlei arten lösen
grüss und noch 'n schönes weihnachten GG, der mit den dynamischen arrays noch immer nicht umgehen kann ;-) |
Re: StringReplace und doppelte Zeichen
Zitat:
Variante Opa: 35 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 10 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante alzaimar: 9 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante Grenzgaenger: 28 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen die Variante von DAX ist zwar die zweit schnellste, aber vom Ergebnis her... |
Re: StringReplace und doppelte Zeichen
habe das ganze mal, statt als Funktion als Procedure impelentiert...
hier das Ergebnis:
Code:
und der Code:
Variante Opa: 35 Ticks mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 10 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante alzaimar: 9 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante Grenzgaenger: 11 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 10 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen
Delphi-Quellcode:
procedure ReplaceDChar(Var Quelle: string; aChar: char);
var i, j: integer; begin j := 1; for i := 2 to length(quelle) do if (quelle[i]<>quelle[j]) or (aChar<>quelle[j]) then begin j := j + 1; quelle[j] := quelle[i]; end; setlength(quelle, j); end; |
Re: StringReplace und doppelte Zeichen
Ick bin ja auch blöd: Übergebe ein Zeichen, dessen doppelte Vorkommen weggeschnippelt werden sollen, und dann wird dieses Zeichen ignoriert...
Delphi-Quellcode:
Eigentlich der gleiche Code wie vom Grenzgaenger... Optimieren kann man das, indem man z.B. bis zum ersten Auftreten des Zeichens springt. Insbesondere der Code von Grenzgaenger wird dann schneller.
Function RemoveCharRepetitions(Const aText: String; aChar: Char): String;
Var i, j: Integer; c: Char; Begin setLength(Result, Length(aText)); If Length(aText)=0 Then Exit; j := 1; c := aText[1]; Result[1] := c; For i := 2 To Length(aText) Do If (c<>aChar) or (aText[i] <> c) Then Begin Inc(j); c := aText[i]; Result[j] := c; End; SetLength(Result, j); End; |
Re: StringReplace und doppelte Zeichen
Wunderbar :-)
Code:
keine Ahnung wie Alzaimar das geschafft hat... denke, da kann man dann nur noch mit Assembler was rausholen... viel wirds aber nicht mehr werden...
Variante Opa: 35 Ticks mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 10 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante alzaimar: 9 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Grenzgaenger: 10 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 10 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen |
Re: StringReplace und doppelte Zeichen
Zitat:
Versuch doch mal:
Delphi-Quellcode:
Könnte funktionieren und könnte auch noch schneller sein.
procedure ReplaceDChar(Var Quelle: string; aChar: char);
var i, j: integer; c : Char; label 1; begin // Erstmal zum ersten Auftreten von aChar hüpfen. For j := 1 to Length (Quelle) Do if Quelle[j]=aChar then goto 1; // Nicht hauen, soll ja schnell sein Exit; // -------- 1:c := quelle[j]; for i := j+1 to length(quelle) do if (quelle[i]<>c) or (aChar<>c) then begin j := j + 1; c := quelle[i]; quelle[j] := c; end; setlength(quelle, j); end; Dann könnte man noch darauf verzichten, jedesmal ein einzelnen Zeichen zu bewegen. Erst wenn sich (j-i) ändert, kopiert man per Copy (was schneller ist, als Zeichen-für-Zeichen zu kopieren) das letzte Teilstück. Auch das könnte was bringen. |
Re: StringReplace und doppelte Zeichen
tja, war wohl nicht ganz so gut ... mit dem goto ...
Code:
2 ticks langsamer...
Variante Opa: 34 Ticks mit dem Ergebnis: Erfolgreich
Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante DAX: 11 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen Variante alzaimar: 11 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante Grenzgaenger: 11 Ticks mit dem Ergebnis: Erfolgreich Ergebnisstring: Dies ist ein Test xCCCx mit Zeichen Variante himitsu: 10 Ticks mit dem Ergebnis: Falsche Konvertierung Ergebnisstring: Dies ist ein Test xCx mit Zeichen |
Re: StringReplace und doppelte Zeichen
Delphi-Quellcode:
Gehts so?
function ReduceMultiples(const s: string; c: char): string;
var pe, pr, pc: PChar; i: integer; begin if s = '' then exit; SetLength(result, Length(s)); pc := @s[1]; i := 0; while pc^ <> c do begin Inc(pc); Inc(i); end; if i > 0 then begin Move(s[1], result[1], i); pe := @s[i+1] + Length(s) - i; pr := @result[i+1]; end else begin pe := @s[1] + Length(s); pr := @result[1]; end; while pc <> pe do begin while (pr^ = pc^) and (pc^ = c) do Inc(pc); pr^ := pc^; Inc(pr); Inc(pc); end; SetLength(result, pr - @result[1]); end; |
Re: StringReplace und doppelte Zeichen
Fehlermeldung:
Delphi-Quellcode:
if i > 0 then begin
Move(@s[1], @result[1], i); << E2036 Variable erforderlich pe := @s[i+1] + Length(s) - i; pr := @result[i+1]; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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