2 просмотров

Использование 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 указывает, владеет ли словарь ключами, значениями или и тем, и другим — и, следовательно, помогает избежать утечек памяти.

голоса
Рейтинг статьи
Статья в тему:  О генеральных инспекторах США
Ссылка на основную публикацию
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x