Hi,
ich weiß zwar nicht genau warum
OOP nicht dein Ding ist, aber da du nicht etwas generelles gegen Klassen hast (du verwendest ja eine TStringList) solltest du doch die Variante von Jens vorziehen.
An sich ist es natürlich sauberer ein Integer in einem Wrapper auch wirklich als Objekt zu übergeben. Klar, hier eine Referenz eh ein Integer, aber wenn Delphi mal etwas typsicherer wird...
Jedenfalls zeigt dir Jens Lösung, dass du mit einer Liste auskommst. Du hast eine Art Dictonary. Hier wird ein Tupel (Schlüssel, Wert) abgespeichert. Anhand von Schlüssel kannst du dir den gespeicherten Wert zurückgeben lassen. Wird die Liste z.B. sortiert, bleibt diese Zuordnung automatisch erhalten.
Wenn du hier noch ein THashedStringList verwendest (ein Nachfahre der TStringList) dürfte sich auch dir Perfomance noch einmal ordentlich verbessern.
Als einfaches Beispiel:
Delphi-Quellcode:
type
TIntegerWrapper = class(TObject)
private
FValue : Integer;
public
Value : Integer read FValue write FValue;
end;
...
procedure toList(const s : String; const List : TStringList);
var buffer : TIntegerWrapper;
begin
if assigned(List) then
begin
if List.indexOf(s) > -1 then
begin
buffer := TIntegerWrapper(List.Objects[List.indexOf(s)]);
buffer.Value := buffer.Value + 1;
end
else
begin
buffer := TIntegerWrapper.Create;
buffer.Value := 1;
List.AddObject(s, buffer);
end;
end;
end; // procedure toList(const s : String; const List : TStringList);
Hier siehst du, dass du mit einer Liste auskommst. Es ist jetzt egal was du mit der Liste machst, die Zuordnung String -> Anzahl würde immer erhalten bleiben (beim Einfügen, Löschen, Sortieren, ...). Mittels AddObject legst du einfach an der Stelle des Strings einen Verweis auf ein Objekt ab. Dieser Verweis bleibt immer erhalten. Wie man damit arbeitet hat dir Jens eigentlich schon gezeigt, hier ist einfach nur ein Wrapper zu gegekommen.
Gruß Der Unwissende