Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Schnellste Art einen String zu Parsen


Maluku Simbali - Fr 17.07.15 10:47
Titel: Schnellste Art einen String zu Parsen
Hallo,

wie kann ich einen string oder utf string am schnellsten parsen ? ich bin noch absoluter rookie ... hier mein vorschlag aber mein lehrer meinte es wäre sehr langsam.


Delphi-Quelltext
1:
2:
3:
4:
for indexcount := 1 to length(tempstring) do
begin
 Showmessage(tempstring[indexcount]);
end;


Vielleicht könnt ihr mir weiterhelfen.

Vielen Dank,
Maluku (Masi)


platzwart - Fr 17.07.15 10:53

Was willst du denn machen? Was verstehst du unter "parsen"???


Maluku Simbali - Fr 17.07.15 10:57

Hi Platzwart,

ich möchte einen String Buchstaben für Buchstaben durchgehen ... es geht darum zu checken wieviele Buchstaben welchen Typs in einem String sind


baumina - Fr 17.07.15 10:59

Die Pos-Funktion innerhalb der System-Unit von Delphi geht auch so vor, also hat dein Lehrer meiner Meinung nach schon sehr hohe Ansprüche.

Gehst du allerdings pro gesuchten Buchstaben jedesmal durch die for-Schleife, muss ich deinem Lehrer recht geben.


platzwart - Fr 17.07.15 11:11

In diesem Fall würde ich es auch so machen, wie du es geschrieben hast...


Maluku Simbali - Fr 17.07.15 11:20

Wirklich ? ... ich war mir nicht bewusst dass die Ansprüche so hoch sind. Ist das denn die schnellste Variante einen String char by char durchzugehen bzw. auszulesen ?


baumina - Fr 17.07.15 11:30

Wenn es für den speziellen Anwendungsfall nicht notwendig wäre komplett Zeichen für Zeichen durch den String zu gehen, aber so wie du deinen Fall beschreibst, fällt mir nichts schnelleres ein.


Nersgatt - Fr 17.07.15 11:32

Meistens kann man noch anderen Stellen optimieren.
Wenn Du z.B. eine Aufstellung machen sollst, wie viele A, wie viele B, wie viele C, usw im Text sind, dann wäre es beispielsweise unglücklich für jeden Buchstaben den Text einmal komplett zu durchlaufen.
Beschreib doch mal die Aufgabe komplett und zeig Deinen Lösungsansatz. Dann kann man schauen, wo man dran drehen kann.


GuaAck - Fr 17.07.15 19:41

Hallo,

das folgende müsste schon recht schnell sein:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
VAR
  Zaehler: Array[byte] of cardinal;
  c: byte;

BEGIN
{... Initialisierung natürlich ....}
FOR index := 1 to length(meinstring) do
  begin
  c :=ord(meinstring[index]);
  Zaehler[c] := Zaehler[c]+1
  end;
END;


Wenn es noch schneller werden soll, dann bietet meinstring[index] Potenzial, aber die Übersichtlichkeit ist dann weg.(meinstring[index] sieht wie ein array aus, aber da das array ja dynamisch verlängert werden kann, muss die Windows-Speicher-Verwaltung den Zugriff managen, jeder Zugriff ist also mit einem Funktionsaufruf verbunden. )

Gruß
GuaAck


Xion - Fr 17.07.15 21:38

Beachte: Der Code von user profile iconGuaAck funktioniert nur für ASCII (255 Zeichen). Ich bin mir gerade unsicher, wie Delphi mit UTF8 umgeht. Es ginge aber auch ähnlich für mehr als 255 Zeichen (eventuell mit einer Hashtabelle).

Wenn du Zeichen zählen sollst, dann musst du logischerweise alle Zeichen mindestens einmal durchgehen. An der Schleife kommst du da faktisch nicht vorbei.