Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   StringReplace und doppelte Zeichen (https://www.delphipraxis.net/105530-stringreplace-und-doppelte-zeichen.html)

Dax 24. Dez 2007 18:18

Re: StringReplace und doppelte Zeichen
 
aChar wird bei dir aber auch nicht verwendet :stupid:

grenzgaenger 24. Dez 2007 18:19

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
  • mit setlengh, zu anfang und am schluss, wie bei DAX oder
  • in dem du aus String 'n ShortString machst, dann ist es aber auf 255 zeichen beschränkt

grüss und noch 'n schönes weihnachten

GG, der mit den dynamischen arrays noch immer nicht umgehen kann ;-)

grenzgaenger 24. Dez 2007 19:54

Re: StringReplace und doppelte Zeichen
 
Zitat:

Zitat von Opa
Opa - 00-00-00-156 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-031 - Ich x bin x der x schnellste x Hase x der der Welt
----------------------------------------------------
Opa - 00-00-00-172 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-016 - Ich x bin x der x schnellste x Hase x der der Welt
----------------------------------------------------
Opa - 00-00-00-172 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-031 - Ich x bin x der x schnellste x Hase x der der Welt

DAX, deine ist wirklich die Schnellste, Respekt.
Meine kommt dann in die Tonne :zwinker:
MFG

@Opa: ich kann dein Ergebnis nicht nachvollziehen...
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...

grenzgaenger 24. Dez 2007 20:07

Re: StringReplace und doppelte Zeichen
 
habe das ganze mal, statt als Funktion als Procedure impelentiert...

hier das Ergebnis:
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
und der Code:
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;

alzaimar 24. Dez 2007 20:11

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:
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;
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.

grenzgaenger 24. Dez 2007 20:30

Re: StringReplace und doppelte Zeichen
 
Wunderbar :-)

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: 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
keine Ahnung wie Alzaimar das geschafft hat... denke, da kann man dann nur noch mit Assembler was rausholen... viel wirds aber nicht mehr werden...

alzaimar 24. Dez 2007 20:45

Re: StringReplace und doppelte Zeichen
 
Zitat:

Zitat von grenzgaenger
keine Ahnung wie Alzaimar das geschafft hat...

Ich habe eine Stringindizierung weniger als Du. Also ich nicht, sondern der Code. :stupid:

Versuch doch mal:

Delphi-Quellcode:
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;
Könnte funktionieren und könnte auch noch schneller sein.

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.

grenzgaenger 24. Dez 2007 20:58

Re: StringReplace und doppelte Zeichen
 
tja, war wohl nicht ganz so gut ... mit dem goto ...

Code:
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
2 ticks langsamer...

Dax 24. Dez 2007 21:01

Re: StringReplace und doppelte Zeichen
 
Delphi-Quellcode:
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;
Gehts so?

grenzgaenger 24. Dez 2007 21:12

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.
Seite 3 von 5     123 45      

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