AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wie oft ist ein Zeichen in einem String

Ein Thema von uplink · begonnen am 25. Jan 2007 · letzter Beitrag vom 26. Jan 2007
Antwort Antwort
Seite 3 von 3     123
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Wie oft ist ein Zeichen in einem String

  Alt 25. Jan 2007, 22:07
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;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#22

Re: Wie oft ist ein Zeichen in einem String

  Alt 26. Jan 2007, 09:18
Zitat von cruiser:
Und dass ich den uralten Code wirklich langsam mal optimieren muss

Edit: Okay.. ich fordere ein neues Rennen

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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#23

Re: Wie oft ist ein Zeichen in einem String

  Alt 26. Jan 2007, 09:23
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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#24

Re: Wie oft ist ein Zeichen in einem String

  Alt 26. Jan 2007, 17:36
In Sachen CountSubStr gibt's och noch was in der CodeLib
> http://www.delphipraxis.net/internal...ct.php?t=61002
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#25

Re: Wie oft ist ein Zeichen in einem String

  Alt 26. Jan 2007, 17:50
hab auch noch einen:
http://www.swissdelphicenter.ch/de/showcode.php?id=1501
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.
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