Хэш-таблицы
Хэш-таблицы
Простые и динамические массивы удобны прежде всего тем, что вы можете напрямую обратиться к любому элементу по индексу. Конечно, для этого необходимо знать индекс. В следующей структуре данных — хэш-таблице — произвольный доступ к данным осуществляется по ключу. Допустим, у вас имеется хэш-таблица с именем theData. Команда theData("Bill 's Address") позволяет извлечь из хэш-таблицы нужный элемент без циклического перебора всего содержимого. Хэш-таблицы очень удобны в ситуациях, когда вы хотите получить быстрый доступ к значению по связанному с ним уникальному атрибуту, то есть ключу. Разумеется, программирование хэш-таблицы — задача непростая [ Для этого необходимо построить хорошую функцию хэширования для вычисления индекса данных по ключу, а также решить неизбежную проблему коллизий, то есть совпадения хэш-кодов у двух разных элементов. Даже терминология выглядит устрашающе... ], но, к счастью, эта работа уже выполнена за вас разработчиками .NET Framework.
Другую категорию структур данных, предназначенных для выборки значения по ключу, составляют ассоциативные массивы (словари). Они часто реализуются в виде хэш-таблиц с дополнительным кодом для выполнения особых операций (например, обнаружения повторяющихся значений или ключей).
В табл. 4.4 перечислены важнейшие методы класса Hashtable (за полным списком обращайтесь к электронной документации).
Методы класса HashTable учитывают регистр символов в строковых ключах, и действие команды Option Compare Text на них не распространяется. О том, как создать хэш-таб-лицу, игнорирующую регистр символов, рассказано в главе 5.
Таблица 4.4. Важнейшие методы класса Hashtable
Имя |
Описание | ||||
Add |
Добавляет новую пару «ключ/значение» в хэш-таблицу | ||||
Clear |
Удаляет из хэш-таблицы все содержимое | ||||
ContainsKey |
Проверяет, содержит ли хэш-таблица заданный ключ (с учетом регистра символов) | ||||
ContainsValue СоруТо |
Проверяет, содержит ли хэш-таблица заданное значение (с учетом регистра символов) Копирует элементы хэш-таблицы в массив | ||||
Count |
Возвращает количество пар «ключ/значение» в хэш-таблице | ||||
Item |
Свойство по умолчанию. Получает или задает значение, связанное с указанным ключом | ||||
Keys |
Возвращает все ключи хэш-таблицы в виде коллекции, содержимое которой перебирается в цикле For-Each | ||||
Remove |
Удаляет из хэш-таблицы значение с заданным ключом | ||||
Values |
Возвращает все значения хэш-таблицы в виде коллекции, содержимое которой перебирается в цикле For-Each | ||||
При помощи класса Hashtable можно сохранить информацию, полученную при вызове метода GetEnvironmentVariables класса System. Environment. Приведенная ниже небольшая программа выводит имена и значения всех переменных окружения, определенных в системе. Программу можно завершить в любой момент, просто закрыв консольное окно. Сначала просмотрите листинг, а потом мы объясним пару неочевидных моментов:
1 Option Strict On
2 Imports System.Environment
3 Module Modulel
4 Sub Main()
5 Dim eVariables As Hashtable
6 eVariables =CType(GetEnvironmentVariables().
Hashtable)
7 Console.Writel_ine("Press Enter to
see the next item")
8 Dim thing As Object
9 For Each thing In eVariables.Keys
10 Console.WriteLineC'The environment
variable named " & _
11 thing. ToString() & "has value " &
eVariables(thing).ToString())
12 Console. ReadLine()
13 Next
14 End Sub
15 End Module
Прежде всего использованный в строке 6 упрощенный синтаксис имени метода стал возможным благодаря вызову Imports в строке 2: eVariables =CType(GetEnvironmentVariables(),Hashtable)
Значение, полученное при вызове GetEnvironmentVariables(), преобразуется в хэш-таблицу функцией СТуре [ Возможно, в будущих иерсиях .NET такое преобразование работать не будет. ]. В строках 8 и 9 для перебора элементов хэш-таблицы используется переменная типа Object:
Dim thing As Object
For Each thing In eVariables.Keys
В стандартных хэш-таблицах хранятся только объекты. Но поскольку в VB .NET все данные являются объектными, строковые значения переменных окружения также могут сохраняться в переменной thing. Программа перебирает содержимое коллекции Keys и при помощи свойства Item для каждого ключа получает ассоциированное значение. Конструкцию eVariables(thing) в строке 11 также можно записать в следующем виде:
eVariables.Item(thing)
В строке 11 вызывается метод ToString, определенный в каждом классе (этот важный метод описан в главе 5). Здесь этот метод используется для вывода строкового представления ключа.