![]() |
Wie oft ist ein Zeichen in einem String
Hallöle,
wollt mal wissen ob es eine Funktion gibt, dir mir sagt wie oft ein Zeichen in einem String vorkommt? mfg Uplink |
Re: Wie oft ist ein Zeichen in einem String
Stndardmäßig glaube nicht, kann aber mit pos/posex leicht selbst geschrieben werden.
|
Re: Wie oft ist ein Zeichen in einem String
Delphi-Quellcode:
Function CountChar(Const AString: String; Const AChar: Char): Integer;
Var lStr: PChar; Begin Result := 0; lStr := PChar(AString); If Assigned(lStr) Then Begin While ( lStr^ <> #0 ) Do Begin If lStr^ = AChar Then Inc(Result); Inc(lStr); End; End; End; |
Re: Wie oft ist ein Zeichen in einem String
Delphi-Quellcode:
Mist zu spät...
function bla(s : String; z : String) : Integer;
var i : Integer; begin Result := 0; for i := 1 to Length(s) do begin if s[i] = z then inc(Result); end; end; procedure TfrmMain.Button1Click(Sender: TObject); begin bla('asbsdddds', 'd'); end; |
Re: Wie oft ist ein Zeichen in einem String
Delphi-Quellcode:
function CountSubStr(SubStr, Str: string): integer;
begin Result := 0; while pos(SubStr, Str) > 0 do begin Result := Result + 1; Str := Copy(Str, Pos(SubStr, Str) + Length(SubStr), Length(Str)); end; end; |
Re: Wie oft ist ein Zeichen in einem String
Ok thx @all, jetz hab ich ja ne Auswahl :)
Danke an euch, dass es so schnell ging. Mfg Uplink. |
Re: Wie oft ist ein Zeichen in einem String
oder so:
Delphi-Quellcode:
function Zeichen(const s: String; const z: Char): Integer;
var I: Integer; begin result := 0; for I := 1 to length(s) do if s[i] = z then inc(result); end; |
Re: Wie oft ist ein Zeichen in einem String
Da würde ich glatt mal frech fragen: wer hat die schnellste?
|
Re: Wie oft ist ein Zeichen in einem String
Zitat:
Zitat:
Delphi-Quellcode:
Obwohl die inrementiertung doch eigentlich schneller gehen könnte ... Oder nicht (x := x + 1)?
function Zeichen(const s: String; const z: Char): Integer;
var I: Integer; begin result := 0; // Tab for I := 1 to length(s) do // Tab // kein Begin, aber irrelevant if s[i] = z then // Tab & umgebrochen! inc(result); // Umgebrochen // ein end, aber irrelevant end; |
Re: Wie oft ist ein Zeichen in einem String
Wo gab es den schonmal ? Vlt. in einem anderen Thread, aber ich habe doch schneller gepostet :P
|
Re: Wie oft ist ein Zeichen in einem String
Bei meiner könnt man nich das Result erhöhen mit Inc() machen... und evtl. PosEx statt Pos + Copy verwenden... ansonsten läuft die auch für Fragen wie "Wie oft ist
im Quelltext?" ;) |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
|
Re: Wie oft ist ein Zeichen in einem String
[quote="xZise"]
Zitat:
Zitat:
Delphi-Quellcode:
-> 7 sekunden
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer; Start: TTime; begin Start := Now; for I := 1 to 100000000 do Zeichen('abcabcabcabcabcabcabcabcabcabc', 'a'); label1.Caption := TimeToStr(Now-Start); end; |
Re: Wie oft ist ein Zeichen in einem String
Wenn du eine Geschwindigkeitsmessung durchführen willst, kannst du TTime eigentlich vergessen. Nimm lieber
![]() |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
![]() |
Re: Wie oft ist ein Zeichen in einem String
Dann muss ich doch noch einen draufsetzen.
Im Prinzip zwar das Gleiche, aber StrCharsCount zählt gleich mehrere Zeichen auf einmal.
Delphi-Quellcode:
Kopiert aus der JCL. :angel2:
function StrCharCount(const S: string; C: Char): Integer;
var I: Integer; begin Result := 0; for I := 1 to Length(S) do if S[I] = C then Inc(Result); end; function StrCharsCount(const S: string; Chars: TSysCharSet): Integer; var I: Integer; begin Result := 0; for I := 1 to Length(S) do if S[I] in Chars then Inc(Result); end; anzahl := StrCharsCount('Delphi2007', ['0'..'9']); // ergibt 4 |
Re: Wie oft ist ein Zeichen in einem String
Dem Fragesteller ist mit den Lösungen eigentlich recht wenig geholfen. Er kann sich die Funktionen kopieren aber der Lerneffekt ist fast 0
|
Re: Wie oft ist ein Zeichen in einem String
Delphi-Quellcode:
Sieger ist "Zeichen" mit etwa 140ms
procedure TForm1.Button1Click(Sender: TObject);
var s:string; i:integer; a:array[0..4] of cardinal; begin setlength(s,100000); for i:=1 to 100000 do s[i]:=chr(i mod 10 +60); memo1.Clear; a[0]:=gettickcount; for i:=1 to 1000 do Zeichen(s,'A'); a[1]:=gettickcount; for i:=1 to 1 do countsubstr('A',s); a[2]:=gettickcount; for i:=1 to 1 do bla(s,'A'); a[3]:=gettickcount; for i:=1 to 1000 do countchar(s,'A'); a[4]:=gettickcount; for i:=1 to 4 do memo1.lines.add(inttostr(a[i]-a[i-1])); end; Zweiter ist "countchar" mit etwa 200ms Dritter ist "bla" mit etwa 31ms *1000 ==>31s Vierter ist "Countsubstr" mit 953ms *1000 ==>953s Und wir haben keinen Letzten! zur Verteidigung von countsubstr muss man noch erwähnen, dass er statt Zeichen zu zählen, gleich ganze Teilstrings gezählt hat (wie ja auch der Titel sagt) (Mehr Aufwand für die Zeitrechnung wollte ich nicht treiben) |
Re: Wie oft ist ein Zeichen in einem String
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; |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
Delphi-Quellcode:
ich komme auf 203 ms...
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer; s: String; tick: Cardinal; begin setlength(s,100000); for i:=1 to 100000 do s[i]:=chr(i mod 10 +60); tick := GetTickCount; for I := 1 to 1000 do CountSubStr('A', s); label1.Caption := IntToStr(GetTickCount - Tick); end; |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
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; |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
|
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) |
Re: Wie oft ist ein Zeichen in einem String
In Sachen CountSubStr gibt's och noch was in der CodeLib :angel:
> ![]() |
Re: Wie oft ist ein Zeichen in einem String
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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 by Thomas Breitkreuz