Delphi-PRAXiS
Seite 4 von 16   « Erste     234 5614     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anzahl eines Zeichens im String ermitteln (https://www.delphipraxis.net/116372-anzahl-eines-zeichens-im-string-ermitteln.html)

himitsu 12. Jul 2018 10:47

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1406963)
Zitat:

Zitat von himitsu (Beitrag 1406941)
Delphi-Quellcode:
z := TRegEx.Match(str, c).Groups.Count;

// falls C eines der RegEx-Controlzeichen sein könnte, sollte man es vielleicht besser noch escapen
z := TRegEx.Match(str, Format('\x%.2x', [Ord(c)])).Groups.Count;

Welche Unit muss ich dafür einbinden, in meiner Hilfe finde ich nichts über ein TRegEx.

Solche Komponenten gibt es auch als Freeware von Fremdanbietern. (Emba hat da auch nur geklaut abgeguckt)

KodeZwerg 12. Jul 2018 11:38

AW: Anzahl eines Zeichens im String ermitteln
 
Danke für diese Information.
BTW Wie findet ihr die Variante mit (Ansi-)StrScan ? Gut oder doof?

Uwe Raabe 12. Jul 2018 12:49

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407014)
BTW Wie findet ihr die Variante mit (Ansi-)StrScan ? Gut oder doof?

Zwei durch einen Funktionsaufruf geschachtelte Schleifen, das Hin- und Her-Gecaste mit Ansi und Unicode, die mehrfachen, komplexen Abfragen auf MBCS Zeichen - eher suboptimal und potentiell langsamer als die einfache For-Schleife über den string, die vom Compiler auch noch optimiert werden kann.

Zitat:

Zitat von KodeZwerg (Beitrag 1406975)
Habs gerade mit normalen Strings getestet, funktioniert immer noch (Sau-)schnell.

Hast du mal konkrete Zeiten verglichen oder ist das nur so gefühlt?

KodeZwerg 12. Jul 2018 13:29

AW: Anzahl eines Zeichens im String ermitteln
 
Ich hatte es nur einmal gebencht (die StrScan nicht AnsiStrScan), Jahrzehnte her, da gewann im Benchmark immer die StrScan vs ForToLength. Je Länger der InputString umso deutlicher wurde das Ergebnis. Ich schau mal ob ich einen Benchmark bastel und stell den dann gerne hier vor, ich werde alle Varianten aus diesem Thread darin antreten lassen, implementieren kann ich allerdings nur Methoden die ich mit D2009 auch umsetzen kann, dann Wissen wirs exakter :idea:
Ps: Es ist nur eine Schleife bei mir.

Uwe Raabe 12. Jul 2018 13:47

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407024)
Ps: Es ist nur eine Schleife bei mir.

Die andere läuft innerhalb StrScan/AnsiStrScan.

Wenn die For-Schleife denn unbedingt vermieden werden soll, kann man es auch so machen:
Delphi-Quellcode:
function CharCount(const S: string; const C: Char): Integer;
var
  N: Integer;
  P: PChar;
begin
  N := 0;
  P := PChar(S[1]);
  while P^ <> #0 do begin
    if P^ = C then Inc(N);
    Inc(P);
  end;
  Result := N;
end;

KodeZwerg 12. Jul 2018 15:06

AW: Anzahl eines Zeichens im String ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein Benchmark Source-Only Projekt.
Eindeutiger Gewinner = StrScan()
Eindeutiger Verlierer = Ydobon mit
Delphi-Quellcode:
x := Length(Data)-Length(StringReplace(Data, 'X', '', [rfReplaceAll]))
.
Am zweitbesten schneidet bei mir alzaimar mit IFCount(Data, 'X'), respekt dafür:thumb::thumb:
Dahinter alles andere, schlusslicht bei den normalen Methoden ist AnsiStrScan().

@Uwe, Dein letzter Code löst bei mir bei Aufruf eine Exception aus, der Code ist bereits enthalten, nur in der Mausklick Procedure rausgeklammert.

Uwe Raabe 12. Jul 2018 15:56

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407033)
@Uwe, Dein letzter Code löst bei mir bei Aufruf eine Exception aus

Das muss natürlich auch
Delphi-Quellcode:
P := PChar(S);
heißen.

KodeZwerg 12. Jul 2018 16:01

AW: Anzahl eines Zeichens im String ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dein letzter Code führt damit die Rangliste an!! Grandioses Ergebnis, schlägt alles um Längen:thumb::thumb:

Tut mir leid, da muss wohl mein Rechner noch an was gewerkelt haben als ich es testete.
StrScan() immer noch #1 aber total dicht dahinter ist Dein Code (@Uwe), im Grunde teilen die sich die Pole-Position.

Im Anhang aktualisiert Fassung, das StringReplace ist rauskommentiert deswegen immer 0 Nanosekunden.
Fenster ist nun sizeable, Memo ist AlignClient.
Ein Kompilat zum sofort Testen ist enthalten.

gammatester 12. Jul 2018 16:19

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1407025)
Wenn die For-Schleife denn unbedingt vermieden werden soll, kann man es auch so machen:
Delphi-Quellcode:
function CharCount(const S: string; const C: Char): Integer;
var
  N: Integer;
  P: PChar;
begin
  N := 0;
  P := PChar(S[1]);
  while P^ <> #0 do begin
    if P^ = C then Inc(N);
    Inc(P);
  end;
  Result := N;
end;

Der Code (und auch einige andere) bricht aber die Schleife ab, wenn S ein #0 enthält, zB S = '123'#0#1#2'123'. (Habe nicht den ganzen Thread gelesen, und weiß also nicht ob das verboten ist).

Uwe Raabe 12. Jul 2018 16:38

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von gammatester (Beitrag 1407043)
Der Code (und auch einige andere) bricht aber die Schleife ab, wenn S ein #0 enthält, zB S = '123'#0#1#2'123'. (Habe nicht den ganzen Thread gelesen, und weiß also nicht ob das verboten ist).

Ja, das machen alle Lösungen, die auf PChar basieren. Wenn das ein Kriterium ist (z.B. wenn man die Anzahl der #0 im String zählen will), dann muss es halt doch über die For-Schleife gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 Uhr.
Seite 4 von 16   « Erste     234 5614     Letzte »    

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