Използване на TDictionary за хеш таблици в Delphi

click fraud protection

Въведена в Delphi 2009, The Клас TDT, дефинирани в Generics. Колекция единица, представлява обща колекция тип хеш-таблица от двойки ключ-стойност.

Родови типове, също въведена в Delphi 2009, ви позволява да дефинирате класове, които не дефинират конкретно типа на членовете на данните.

Речник по някакъв начин е подобен на масив. В ан масив работите със серия (колекция) от стойности, индексирани с цяло число, което може да бъде всяко порядъчна стойност на типа. Този индекс има долна и горна граница.

В речник можете да съхранявате ключове и стойности, където и двете могат да бъдат от всякакъв тип.

Конструкторът на TDictionary

Оттук и декларацията на конструктора TDictionary:

В Delphi TDictionary се дефинира като хеш таблица. Таблиците на хеш представляват съвкупност от двойки ключ и стойност, които са организирани въз основа на хеш-кода на ключа. Таблиците на хешовете са оптимизирани за търсене (скорост). Когато двойка ключ-стойност се добави към хеш-таблицата, хешът на ключа се изчислява и съхранява заедно с добавената двойка.

instagram viewer

TKey и TValue, тъй като са генерични, могат да бъдат от всякакъв тип. Например, ако информацията, която искате да съхранявате в речника, идва от някаква база данни, вашият ключ може да бъде GUID (или някаква друга стойност, представяща стойността на уникалния индекс), докато Value може да бъде обект, картографиран на ред данни във вашата база данни маси.

Използване на TDictionary

За простота, примерът по-долу използва цели числа за TKeys и символи за TValues.

Първо декларираме нашия речник, като посочваме какви ще бъдат типовете TKey и TValue:

Тогава речникът се попълва с помощта на метода Добавяне. Тъй като речникът не може да има две двойки с една и съща стойност Key, можете да използвате метода ContainsKey, за да проверите дали някоя двойка с стойност на ключ вече е вътре в речника.

За да премахнете чифт от речника, използвайте метода за премахване. Този метод няма да създаде проблеми, ако двойка с определен ключ не е част от речника.

За да преминете през всички двойки, преглеждайки ключове, можете да направите for in loop.

Използвайте метода TryGetValue, за да проверите дали някоя двойка ключ-стойност е включена в речника.

Сортиране на речника

Тъй като речникът е хеш таблица, той не съхранява елементи в определен ред за сортиране. За да повторите чрез ключовете, които са сортирани, за да отговарят на вашите специфични нужди, възползвайте се от TList - общ тип колекция, който поддържа сортирането.

Кодът по-горе сортира ключовете във възходяща и низходяща стойност и грабва стойности, сякаш са съхранени в подредения ред в речника. Нисходящото сортиране на ключови стойности от цяло число използва TComparer и анонимен метод.

Когато ключовете и стойностите са от тип TObject

Изброеният по-горе пример е прост, защото и ключът, и стойността са прости типове. Можете да имате сложни речници, където както ключът, така и стойността са „сложни“ типове като записи или обекти.

Ето още един пример:

Тук се използва персонализиран запис за ключа и персонализиран обект / клас се използва за стойността.

Обърнете внимание на използването на специализиран TObjectDictionary клас тук. TObjectDictionary може да обработва автоматично живота на обектите автоматично.

Стойността Key не може да бъде нулева, докато стойността Value може.

Когато TObjectDictionary е инстанциран, параметърът Ownerships посочва дали речникът притежава ключовете, стойностите или и двете - и следователно ви помага да нямате течове на паметта.

instagram story viewer