Delphi-PRAXiS
Seite 2 von 16     12 3412     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)

inherited 27. Jun 2008 22:45

Re: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von mkinzler
Dann wäre es schlimmstenfalls genauso ineffektiv.

Plus die Zeit die für die Funktionsaufrufe draufgeht plus die Zeit für die Kontrollstruktur drumherum.

Meflin 27. Jun 2008 22:49

Re: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von inherited
Plus die Zeit die für die Funktionsaufrufe draufgeht plus die Zeit für die Kontrollstruktur drumherum.

Ja und?!

Jungs, es ist immerwieder unglaublich, wie man krampfhaft eine simple Frage unglaublich aufblähen kann :roll:

marabu 28. Jun 2008 08:01

Re: Anzahl eines Zeichens im String ermitteln
 
Moin,

Zitat:

Zitat von inherited
... ich denke dass PosEx nichts anderes macht als den String durchzugehen. ...

das ist zu allgemein: PosEx() benötigt noch eine zweite Schleife für den String-Vergleich. PosEx() ist also nur sinnvoll, wenn wirklich nach einem String gesucht wird. Ein String mit der Länge 1 ist aber ein getarnter Char - und den findet man billiger mit einer eigenen Zählschleife.

Delphi-Quellcode:
function Occurs(const s: string; c: Char): Cardinal;
var
  n: Cardinal;
begin
  Result := 0;
  for n := 1 to Length(s) do
    Inc(Result, Ord(s[n] = c);
end;
Freundliche Grüße

Missionar 28. Jun 2008 08:53

Re: Anzahl eines Zeichens im String ermitteln
 
'ne andere Version in die runde geb

Delphi-Quellcode:
function cCount(str: string; c: char): integer;
var
  x: char;
begin
  result := 0;
  for x in str do
    if x = c then inc(result);
end;

alzaimar 28. Jun 2008 09:18

Re: Anzahl eines Zeichens im String ermitteln
 
Delphi-Quellcode:
...
    Inc(Result, Ord(s[n] = c);
...
Ein IF und das Ganze ist 4x schneller (String mit zufälligen Großbuchstaben füllen, nach 'A' suchen).
Delphi-Quellcode:
Function IFCount (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;

Alter Mann 28. Jun 2008 11:39

Re: Anzahl eines Zeichens im String ermitteln
 
???

An Position Null wird die Länge gespeichert, Abfrage also
Delphi-Quellcode:
var
  s : string;
begin
  s := "Wir gewinnen das Finale";
  case s[0] of
   1 : begin end;
   else : s := s + " am Sonntag!";
  end;
end;

Apollonius 28. Jun 2008 11:42

Re: Anzahl eines Zeichens im String ermitteln
 
Du hast wohl zu lange mit reinem Pascal programmiert. In Delphi ist der Standard-String-Type zur Zeit Ansistring und nicht Shortstring. In Ansistrings wird die Länge nicht mehr im ersten Byte gespeichert, sondern liegt in den vier Byte vor dem eigentlichen String. Das Ansprechen von s[0] führt daher zu einem Compiler-Fehler.
Außerdem hat das nichts mit der Frage zu tun.

Alter Mann 28. Jun 2008 16:52

Re: Anzahl eines Zeichens im String ermitteln
 
Stimmt, mit der Frage hat es nichts zu tun :oops:

Graf Gustav 11. Jul 2018 15:15

AW: Anzahl eines Zeichens im String ermitteln
 
Delphi-Quellcode:
z:=Length(str)-Length(StringReplace(str, c, '', [rfReplaceAll]))
@Ydobon:
das ist genial (auch nach 10 Jahren noch) 8-)

himitsu 11. Jul 2018 16:12

AW: Anzahl eines Zeichens im String ermitteln
 
Vom Code her ja, aber von der Ausführungsgeschwindigkeit und vom Speichermanagement her ist es schon ein bisschen grausam.

> eine "nur lese"-Funktion, die daber sehr oft schreibend im Speicher rumpfuscht

Es geht aber inzwischen noch kürzer
Delphi-Quellcode:
z := Length(str) - Length(StringReplace(str, c, '', [rfReplaceAll]));

z := Length(str) - Length(ReplaceStr(str, c, ''));
Gut, da ist dann noch ein CALL mehr drin, aber der fällt nun auch nicht mehr auf.

* aus dem Char "c" einen String machen (Speicher reservieren)
* im StringReplace einen neuen String erstellen und in dem uneffektiv rumfummeln (StringReplace ist nicht grade effektiv geschrieben, also alles umkopieren nach jedem einzelnen ersetzten Char)
* im Delphi zählen die Length wenigstens nicht die Chars, sondern lesen nur die Längenangabe der String aus, aber wollen wir das nicht mit Delphi-Referenz durchsuchenStrLen auch noch etwas disoptimieren?
* die Strings wieder freigeben

* und in älternen Delphi (vor D2006) macht es noch mehr Spaß ... kein FastMM (im langsamen alten Delphi-MemoryManager) ... ohne FastCode (wobei hier StringReplace eh nicht das Schnellste bekommen hat)


Aber da RegEx sowieso das Coolste hier, hier auch noch eine Lösung damit :stupid:
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 Uhr.
Seite 2 von 16     12 3412     Letzte »    

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