Использование TDictionary для хеш-таблиц в Delphi
Зарко Гайич имеет опыт работы с SQL и практические знания систем баз данных, таких как MS SQL Server, Firebird, Interbase и Oracle. Он также владеет XML, DHTML и JavaScript.
Представленный в Delphi 2009, Класс TDictionary, определенный в модуле Generics.Collections, представляет коллекцию пар ключ-значение типа универсальной хеш-таблицы.
Универсальные типы, также представленные в Delphi 2009, позволяют определять классы, которые не определяют конкретно тип элементов данных.
Словарь в некотором роде подобен массиву. В массиве вы работаете с серией (набором) значений, индексированных целочисленным значением, которое может быть значением любого порядкового типа. Этот индекс имеет нижнюю и верхнюю границы.
В словаре вы можете хранить ключи и значения любого типа.
Конструктор TDictionary
Отсюда объявление конструктора TDictionary:
В Delphi TDictionary определяется как хеш-таблица. Хэш-таблицы представляют собой набор пар «ключ-значение», организованных на основе хэш-кода ключа. Хэш-таблицы оптимизированы для поиска (скорости).Когда пара ключ-значение добавляется в хеш-таблицу, хэш ключа вычисляется и сохраняется вместе с добавленной парой.
TKey и TValue, поскольку они являются универсальными, могут быть любого типа. Например, если информация, которую вы должны хранить в словаре, поступает из какой-либо базы данных, ваш ключ может быть значением GUID (или каким-либо другим значением, представляющим уникальный индекс), а значение может быть объектом, сопоставленным со строкой данных в таблицы вашей базы данных.
Использование словаря
Для простоты в приведенном ниже примере используются целые числа для TKeys и символы для TValues.
Во-первых, мы объявляем наш словарь, указав, какими будут типы TKey и TValue:
Затем словарь заполняется с помощью метода Add. Поскольку в словаре не может быть двух пар с одинаковым значением ключа, вы можете использовать метод ContainsKey, чтобы проверить, не содержится ли уже какая-либо пара ключ-значение в словаре.
Чтобы удалить пару из словаря, используйте метод Remove. Этот метод не вызовет проблем, если пара с указанным ключом не входит в состав словаря.
Чтобы просмотреть все пары, перебирая ключи, вы можете выполнить цикл for in.
Используйте метод TryGetValue, чтобы проверить, включена ли в словарь какая-либо пара ключ-значение.
Сортировка словаря
Поскольку словарь представляет собой хеш-таблицу, он не хранит элементы в определенном порядке сортировки. Чтобы просмотреть ключи, отсортированные в соответствии с вашими потребностями, воспользуйтесь TList — общим типом коллекции, поддерживающим сортировку.
Приведенный выше код сортирует ключи по возрастанию и убыванию и извлекает значения, как если бы они были сохранены в отсортированном порядке в словаре. Сортировка по убыванию значений Key целочисленного типа использует TComparer и анонимный метод.
Когда ключи и значения имеют тип TObject
Приведенный выше пример является простым, поскольку и ключ, и значение являются простыми типами. У вас могут быть сложные словари, в которых и ключ, и значение являются «сложными» типами, такими как записи или объекты.
Вот еще один пример:
Здесь пользовательская запись используется для ключа, а пользовательский объект/класс используется для значения.
Обратите внимание на использование специализированного TObjectDictionary класс здесь. TObjectDictionary может автоматически обрабатывать время жизни объектов.
Значение ключа не может быть нулевым, в то время как значение значения может.
Когда создается экземпляр TObjectDictionary, параметр Ownersships указывает, владеет ли словарь ключами, значениями или и тем, и другим — и, следовательно, помогает избежать утечек памяти.