Utilisation de TDictionary pour les tables de hachage dans Delphi

Introduit dans Delphi 2009, le TDictionary class, défini dans les génériques. L'unité Collections représente une collection générique de type table de hachage de paires clé-valeur.

Types génériques, également introduit dans Delphi 2009, vous permet de définir des classes qui ne définissent pas spécifiquement le type de membres de données.

Un dictionnaire est en quelque sorte semblable à un tableau. Dans un tableau vous travaillez avec une série (collection) de valeurs indexées par une valeur entière, qui peut être valeur de type ordinal. Cet indice a une limite inférieure et une limite supérieure.

Dans un dictionnaire, vous pouvez stocker des clés et des valeurs où l'une ou l'autre peut être de n'importe quel type.

Le constructeur TDictionary

D'où la déclaration du constructeur TDictionary:

Dans Delphi, le TDictionary est défini comme une table de hachage. Les tables de hachage représentent une collection de paires clé-valeur organisées en fonction du code de hachage de la clé. Les tables de hachage sont optimisées pour les recherches (vitesse). Lorsqu'une paire clé-valeur est ajoutée à une table de hachage, le hachage de la clé est calculé et stocké avec la paire ajoutée.

instagram viewer

La TKey et la TValue, car ce sont des génériques, peuvent être de tout type. Par exemple, si les informations que vous devez stocker dans le dictionnaire proviennent d'une base de données, votre clé peut être un GUID (ou une autre valeur présentant l'index unique) tandis que la valeur peut être un objet mappé à une ligne de données dans votre base de données les tables.

Utilisation de TDictionary

Par souci de simplicité, l'exemple ci-dessous utilise des entiers pour les TKeys et des caractères pour les TValues.

Tout d'abord, nous déclarons notre dictionnaire en spécifiant quels seront les types de TKey et TValue:

Ensuite, le dictionnaire est rempli à l'aide de la méthode Add. Dans la mesure où un dictionnaire ne peut pas avoir deux paires avec la même valeur de clé, vous pouvez utiliser la méthode ContainsKey pour vérifier si une paire de valeurs clés se trouve déjà dans le dictionnaire.

Pour supprimer une paire du dictionnaire, utilisez la méthode Remove. Cette méthode ne causera pas de problèmes si une paire avec une clé spécifiée ne fait pas partie du dictionnaire.

Pour parcourir toutes les paires en parcourant les clés, vous pouvez faire un pour en boucle.

Utilisez la méthode TryGetValue pour vérifier si une paire clé-valeur est incluse dans le dictionnaire.

Tri du dictionnaire

Étant donné qu'un dictionnaire est une table de hachage, il ne stocke pas les éléments dans un ordre de tri défini. Pour parcourir les clés triées pour répondre à vos besoins spécifiques, profitez de TList - un type de collection générique qui prend en charge le tri.

Le code ci-dessus trie les clés en ordre croissant et décroissant et récupère les valeurs comme si elles étaient stockées dans l'ordre de tri dans le dictionnaire. Le tri décroissant des valeurs de clé de type entier utilise TComparer et une méthode anonyme.

Lorsque les clés et les valeurs sont de type TObject

L'exemple ci-dessus est simple car la clé et la valeur sont des types simples. Vous pouvez avoir des dictionnaires complexes où la clé et la valeur sont des types "complexes" comme des enregistrements ou des objets.

Voici un autre exemple:

Ici, un enregistrement personnalisé est utilisé pour la clé et un objet / classe personnalisé est utilisé pour la valeur.

Notez l'utilisation d'un spécialiste TObjectDictionary classe ici. TObjectDictionary peut gérer automatiquement la durée de vie des objets.

La valeur Key ne peut pas être nulle, tandis que la valeur Value peut l'être.

Lorsqu'un TObjectDictionary est instancié, un paramètre Ownerships spécifie si le dictionnaire possède les clés, les valeurs ou les deux - et vous aide donc à éviter les fuites de mémoire.

instagram story viewer