Dictionaries mit TDictionary Besondere Datentypen

Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 133 MyList.Reverse; lässt sich die Reihenfolge der Elemente umdrehen, also rückwärts sortieren. Auf die einzelnen Elemente einer Liste greift man über ihren Index zu. So gibt beispielsweise ShowMessageIntToStrMyList.Items[2]; den Wert an Indexposition 2 also den dritten Wert aus. Wer nach einem bestimmten Wert in einer sortierten Liste suchen möchte, sollte sich die Methode BinarySearch anschauen. Als Erweiterung einer TList gibt es auch TObjectList. Diese ist hilfreich, wenn die Liste nicht einfache Zahlen wie in obigem Beispiel, sondern Objekte beinhalten soll. Beim Entfernen eines Objekts aus der Liste kann es freigegeben werden. Wichtig hierfür ist die Eigenschaft OwnsObject. Über sie wird festgelegt, ob die Elemente der Liste gehören true oder nicht false. Wenn Elemente der Liste gehören, werden sie beim Entfernen aus der Liste automatisch freigegeben. OwnsObject kann dem Konstruktor Create als Parameter mitgegeben werden. Standardwert ist true. Für Strings gibt es die Klasse TStringList.

4.12.3. Dictionaries mit TDictionary

Die RTL enthält einen weiteren hilfreichen Datentyp, TDictionary. Dabei handelt es sich um eine Sammlung aus Schlüssel-Wert-Paaren, in vielen Programmiersprachen bekannt als Map. Die wichtigsten Funktionen sind bei einem Dictionary das Hinzufügen von Schlüssel-Wert-Paaren – der Schlüssel muss eindeutig sein und darf nicht nil sein – und das Auslesen. Das Hinzufügen geschieht mit Add oder AddOrSetValue. Add wirft eine Exception, falls bereits ein Eintrag mit demselben Schlüssel Key im Dictionary existiert. AddOrSetValue ersetzt in diesem Fall den bereits vorhandenen Eintrag. Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 134 uses Generics.Collections; procedure TForm1.MyMethod; var MyDict: TDictionaryInteger, string; Value: String; begin MyDict := TDictionaryInteger, string.Create; try MyDict.Add1, Eins ; MyDict.Add2, Zwei ; Value := MyDict.Items[2]; Value enthält nun den Wert ‚Zwei‘ MyDict.AddOrSetValue2, Neue Zwei ; Value := MyDict.Items[2]; Value enthält nun den Wert ‚Neue Zwei‘ MyDict.Add2, 2 ; Exception EListError wird geworfen, weil Key 2 schon existiert Zum Auslesen von Werten aus einem Dictionary gibt es verschiedene Methoden. Eine davon haben wir in obigem Beispiel schon gesehen: Items gefolgt vom Key in eckigen Klammern. In unserem Fall sind die Keys vom Typ Integer, weshalb in eckigen Klammern ein Integer steht. Rückgabewert ist der Wert, der zu dem Key gehört in unserem Fall ein String. Existiert der gesuchte Schlüssel im Dictionary allerdings nicht, wird eine EListError-Exception geworfen. Das kann man verhindern, indem man vorher prüft, ob der Schlüssel existiert: ContainsKey. if MyDict.ContainsKey3 then Value := MyDict.Items[3]; Will man sich das Überprüfen sparen, kann man die Methode TryGetValue verwenden, die als zweites Argument einen Out-Parameter bekommt. Die Methode an sich gibt true oder false zurück, je nach dem, ob der Schlüssel gefunden wurde oder nicht. var value: string; begin MyDict.TryGetValue1, value; Normalerweise wird auf den Inhalt von Dictionaries über die Schlüssel zugegriffen, die eindeutig sind. Es kann aber unter Umständen sinnvoll sein, auch nach dem Vorhandensein von Werten zu suchen. Auch das unterstützt TDictionary: if MyDict.ContainsValue ‘Zwei‘ then ...

4.12.4. Stacks und Queues