Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie oft ist ein Zeichen in einem String (https://www.delphipraxis.net/85075-wie-oft-ist-ein-zeichen-einem-string.html)

cruiser 25. Jan 2007 21:07

Re: Wie oft ist ein Zeichen in einem String
 
Zitat:

Zitat von SirThornberry
Dem Fragesteller ist mit den Lösungen eigentlich recht wenig geholfen. Er kann sich die Funktionen kopieren aber der Lerneffekt ist fast 0

Hast du eigentlich recht... mh... ich kommentier mal meine Methode aus:

Delphi-Quellcode:
function CountSubStr(const SubStr, InStr: string): Cardinal;
var
  // aktuelle Position und Länge des Suchstrings als Cardinal
  Offset, Len: Cardinal;
begin
  // Länge des Suchstrings vorberechnen
  Len := Length(SubStr);
  // Aktuelle Position auf das erste Zeichen setzen
  Offset := 1;
  // Ergebnis ist erst mal 0
  Result := 0;
  // Block wiederholen bis (> 1 <)
  repeat
    // Die Position des nächsten Suchstrings merken
    // PosEx fängt bei der alten Position an zu suchen
    Offset := PosEx(SubStr, InStr, Offset);
    // Wenn ein Suchstring gefunden wurde (Offset ist größer 0)
    if Offset > 0 then
    begin
      // Ergebnis erhöhen
      Inc(Result);
      // Position um die Länge des Suchstrings erhöhen
      Inc(Offset, Len);
    end;
  // (> 1 <) Wenn die Aktuelle Position 0 ist (d.h. es wurde kein Suchstring mehr gefunden) steige aus der Schleife aus
  until Offset = 0;
end;

sirius 26. Jan 2007 08:18

Re: Wie oft ist ein Zeichen in einem String
 
Zitat:

Zitat von cruiser
Und dass ich den uralten Code wirklich langsam mal optimieren muss ;)

Edit: Okay.. ich fordere ein neues Rennen :lol:

Neuer Code:

Delphi-Quellcode:
function CountSubStr(SubStr, Str: string): integer;
var
  Offset: Cardinal;
  l: Integer;
begin
  l := Length(SubStr);
  Offset := 1;
  Result := 0;
  repeat
    Offset := PosEx(SubStr, Str, Offset);
    if Offset > 0 then
    begin
      Inc(Result);
      Inc(Offset, l);
    end;
  until Offset = 0;
end;

Du vergleichst immer noch strings. Das dauert zwangsläufig länger. Da brauch ich gar kein neues Rennen starten.

cruiser 26. Jan 2007 08:23

Re: Wie oft ist ein Zeichen in einem String
 
PosEx arbeitet intern auf Pointer-Basis. Ich komme mit deinem Testlauf auf meiner alten Mühle trotz 1000 Wiederholungen auf ~500 ms.

Edit: Okay... hab mich geirrt. Trotzdem ist der Code um längen schneller als der Pos+Copy-Code. Das Copy hat die meiste Zeit geschluckt, nicht das suchen an sich.

Edit2: Hab mal deinen Test übernommen, hier die Ergebnisse auf meiner Maschine:

Code:
1.) Zeichen (1000 Durchläufe): ~312 ms
2.) StrCharCount (1000 Durchläufe): ~350 ms
2.) CountChar (1000 Durchläufe): ~375 ms
3.) CountSubStr (1000 Durchläufe): ~547 ms
4.) Bla (1 Durchlauf): ~16 ms (1000 Durchläufe: ~ 16 sek)

himitsu 26. Jan 2007 16:36

Re: Wie oft ist ein Zeichen in einem String
 
In Sachen CountSubStr gibt's och noch was in der CodeLib :angel:
> http://www.delphipraxis.net/internal...ct.php?t=61002

Helmi 26. Jan 2007 16:50

Re: Wie oft ist ein Zeichen in einem String
 
hab auch noch einen:
http://www.swissdelphicenter.ch/de/showcode.php?id=1501


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr.
Seite 3 von 3     123   

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