Computerwissenschaften

Verwenden von TDictionary für Hash-Tabellen in Delphi

Die in Delphi 2009 eingeführte TDictionary-Klasse , die in der Einheit Generics.Collections definiert ist, repräsentiert eine generische Hash-Tabellentypsammlung von Schlüssel-Wert-Paaren.

Mit generischen Typen. die ebenfalls in Delphi 2009 eingeführt wurden, können Sie Klassen definieren, die den Typ der Datenelemente nicht speziell definieren.

Ein Wörterbuch ähnelt in gewisser Weise einem Array. In einem Array arbeiten Sie mit einer Reihe (Sammlung) von Werten, die durch einen ganzzahligen Wert indiziert sind. Dies kann ein beliebiger Ordnungswert sein. Dieser Index hat eine Unter- und eine Obergrenze.

In einem Wörterbuch können Sie Schlüssel und Werte speichern, wobei beide von einem beliebigen Typ sein können.

 

Der TDictionary-Konstruktor

Daher die Deklaration des TDictionary-Konstruktors:

In Delphi ist das TDictionary als Hash-Tabelle definiert. Hash-Tabellen stellen eine Sammlung von Schlüssel-Wert-Paaren dar, die basierend auf dem Hash-Code des Schlüssels organisiert sind. Hash-Tabellen sind für Lookups (Geschwindigkeit) optimiert. Wenn ein Schlüssel-Wert-Paar zu einer Hash-Tabelle hinzugefügt wird, wird der Hash des Schlüssels berechnet und zusammen mit dem hinzugefügten Paar gespeichert.

Der TKey und der TValue können, da sie Generika sind, von jedem Typ sein. Wenn die Informationen, die Sie im Wörterbuch speichern sollen, beispielsweise aus einer Datenbank stammen, kann Ihr Schlüssel eine GUID (oder ein anderer Wert, der den eindeutigen Index darstellt) sein, während der Wert ein Objekt sein kann, das einer Datenzeile in zugeordnet ist Ihre Datenbanktabellen.

 

Verwenden von TDictionary

Der Einfachheit halber werden im folgenden Beispiel Ganzzahlen für TKeys und Zeichen für TV-Werte verwendet.

Zunächst deklarieren wir unser Wörterbuch, indem wir die Typen von TKey und TValue angeben:

Anschließend wird das Wörterbuch mit der Add-Methode gefüllt. Da ein Wörterbuch nicht zwei Paare mit demselben Schlüsselwert haben kann, können Sie mit der ContainsKey-Methode überprüfen, ob sich bereits ein Schlüsselwertpaar im Wörterbuch befindet.

Verwenden Sie die Remove-Methode, um ein Paar aus dem Wörterbuch zu entfernen. Diese Methode verursacht keine Probleme, wenn ein Paar mit einem angegebenen Schlüssel nicht Teil des Wörterbuchs ist.

Um alle Paare durch Durchlaufen der Tasten zu durchlaufen, können Sie eine for-in-Schleife ausführen .

Verwenden Sie die TryGetValue-Methode, um zu überprüfen, ob ein Schlüssel-Wert-Paar im Wörterbuch enthalten ist.

 

Das Wörterbuch sortieren

Da ein Wörterbuch eine Hash-Tabelle ist, werden Elemente nicht in einer definierten Sortierreihenfolge gespeichert. Nutzen Sie die TList, einen generischen Sammlungstyp, der das Sortieren unterstützt, um die Schlüssel zu durchlaufen, die nach Ihren spezifischen Anforderungen sortiert sind.

Der obige Code sortiert die Schlüssel aufsteigend und absteigend und erfasst die Werte so, als ob sie in der sortierten Reihenfolge im Wörterbuch gespeichert wären. Die absteigende Sortierung von Schlüsselwerten vom Typ Integer verwendet TComparer und eine anonyme Methode.

 

Wenn Schlüssel und Werte vom Typ TObject sind

Das oben aufgeführte Beispiel ist einfach, da sowohl der Schlüssel als auch der Wert einfache Typen sind. Sie können komplexe Wörterbücher haben, in denen sowohl der Schlüssel als auch der Wert „komplexe“ Typen wie Datensätze oder Objekte sind.

Hier ist ein weiteres Beispiel:

Hier wird ein benutzerdefinierter Datensatz für den Schlüssel und ein benutzerdefiniertes Objekt / eine benutzerdefinierte Klasse für den Wert verwendet.

Beachten Sie hier die Verwendung einer speziellen TObjectDictionary- Klasse. TObjectDictionary kann die Lebensdauer von Objekten automatisch verarbeiten.

Der Schlüsselwert kann nicht Null sein, während der Wertwert dies kann.

Wenn ein TObjectDictionary instanziiert wird, gibt ein Ownerships-Parameter an, ob das Wörterbuch die Schlüssel, Werte oder beides besitzt – und hilft Ihnen daher, keine Speicherlecks zu haben.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.