Использование TDictionary для хеш-таблиц в Delphi

Введенный в Delphi 2009, Класс TDictionary, определенный в Обобщениях. Единица коллекций, представляет собой общую коллекцию типов пар хэш-таблиц.

Общие типы, также представленный в Delphi 2009, позволяет вам определять классы, которые не определяют тип элементов данных.

Словарь в некотором роде похож на массив. В массив вы работаете с серией (коллекцией) значений, проиндексированных целочисленным значением, которое может быть любым порядковый тип. Этот индекс имеет нижнюю и верхнюю границу.

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

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

Отсюда и объявление конструктора TDictionary:

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

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

instagram viewer

Использование TDictionary

Для простоты в примере ниже используются целые числа для TKeys и символы для TValues.

Во-первых, мы объявляем наш словарь, указывая типы TKey и TValue:

Затем словарь заполняется с помощью метода Add. Поскольку в словаре не может быть двух пар с одним и тем же значением ключа, вы можете использовать метод ContainsKey, чтобы проверить, находится ли какая-либо пара со значением ключа внутри словаря.

Чтобы удалить пару из словаря, используйте метод Remove. Этот метод не вызовет проблем, если пара с указанным ключом не является частью словаря.

Чтобы пройти все пары, пройдя по клавишам, вы можете сделать для в петле.

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

Сортировка словаря

Поскольку словарь является хеш-таблицей, он не хранит элементы в определенном порядке сортировки. Чтобы перебрать ключи, отсортированные в соответствии с вашими потребностями, воспользуйтесь TList - универсальным типом коллекции, который поддерживает сортировку.

Приведенный выше код сортирует ключи по возрастанию и убыванию и получает значения, как если бы они были сохранены в отсортированном порядке в словаре. Сортировка значений ключа целочисленного типа по убыванию использует TComparer и анонимный метод.

Когда ключи и значения имеют тип TObject

Приведенный выше пример является простым, потому что и ключ, и значение являются простыми типами. У вас могут быть сложные словари, в которых ключ и значение являются «сложными» типами, такими как записи или объекты.

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

Здесь для ключа используется пользовательская запись, а для значения используется пользовательский объект / класс.

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

Значение ключа не может быть равно нулю, а значение значения может быть.

Когда создается экземпляр TObjectDictionary, параметр Ownerships указывает, владеет ли словарь ключами, значениями или обоими, и, следовательно, помогает избежать утечек памяти.

instagram story viewer