Нелінійні структури даних Лекція 8. Хеш-таблиці (словники)
8.1. Клас SortedList<TKey,TValue> - відсортований список
8.2. Клас Dictionary<TKey, TValue> - словник
8.3. Клас SortedDictionary<TKey, TValue> - відсортований словник
Хеш-таблиця, асоціативний масив, або словник — це масив, доступ до елементів якого здійснюється не за номером, а за деяким ключем. Можна сказати, що це таблиця, що складається з пар "ключ-значення". Хеш-таблиця ефективно реалізує операцію пошуку значення за ключем. При цьому ключ перетворюється в число (хеш-код), яке використовується для швидкого знаходження потрібного значення в хеш-таблиці.
Універсальний клас |
Звичайний клас |
SortedList<K,T> |
SortedList |
Dictionary<K,T> |
HashTable |
SortedDictionary<K,T> |
SortedList |
|
|
8.1. Клас SortedList<TKey,TValue> - відсортований список
Клас SortedList<TKey, TValue> реалізований як масив пар "ключ-значення", відсортованих за ключем. Кожен елемент може бути отриманий як елемент типу KeyValuePair<TKey, TValue>.
Це універсальний еквівалент класу колекції SortedList.
У класі SortedList<TKey, TValue> реалізуються інтерфейси:
IDictionary, IDictionary<TKey, TValue>, ICollection, ICollection<KeyValuePair<TKey, TValue», IEnumerable<KeyValuePair<TKey, TValue».
Об'єкти, використовувані як ключі в класі SortedList<TKey, TValue>, повинні залишатися незмінними в коді програми. Кожен ключ в SortedList<TKey, TValue> має бути унікальним. Ключ не може бути null, а значення може, якщо тип значень в списку, TValue, є посилковим типом.
Об'єкт класу SortedList<TKey, TValue> вимагає реалізації засобу порівняння при виконанні сортування і порівнянь. Засіб порівняння за замовчанням властивості Comparer<T>.Default перевіряє, чи реалізує тип ключа TKey інтерфейс System.IComparable<T>, і використовує цю реалізацію, якщо вона є доступною. Якщо вона недоступна, властивість Comparer<T>.Default перевіряє, чи реалізує тип ключа TKey інтерфейс System.IComparable. Якщо тип ключа TKey не реалізує жоден з цих інтерфейсів, можна задати реалізацію інтерфейсу System.Collections.Generic.IComparer<T> у перевантаженні конструктора, що приймає параметр comparer.
Місткість колекції SortedList<TKey, TValue> - це кількість елементів, яку може вмістити SortedList<TKey, TValue>. При додаванні елементів в колекцію SortedList<TKey, TValue> його місткість потрібним чином автоматично збільшується за рахунок перерозподілу внутрішнього масиву. Місткість може бути зменшена за допомогою виклику методу TrimExcess або за допомогою явного завдання властивості Capacity. При зменшенні місткості перерозподіляється пам'ять і усі елементи копіюються в колекцію SortedList<TKey, TValue>.
Для оператора foreach необхідно вказувати тип елементів колекції. Оскільки елементами класу SortedList<TKey, TValue> є пари "ключ-значення", типом елементу не є тип ключа або тип значення. Тут типом елементу є KeyValuePair<TKey, TValue>.
Примітка
Структура KeyValuePair<TKey, TValue> визначена у просторі імен System.Collections.Generic.
Вона служить для зберігання ключа і його значення і застосовується в усіх класах універсальних колекцій, в яких зберігаються пари "ключ-значення", як, наприклад, в класі SortedList<TKey, TValue>, Dictionary<TKey, TValue>, SortedDictionary<TKey, TValue>. У цій структурі визначаються дві наступні властивості.
public TKey Key { get; };
public TValue Value { get; };
У цих властивостях зберігаються ключ і значення відповідного елементу колекції.
Наприклад:
foreach( KeyValuePair<int, string> kvp in mySortedList )
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}
Клас має багато конструкторів.
https://msdn.microsoft.com/ru-ru/library/ms132319(v=vs.110).aspx
В таблиці 1 наведено 2 з них (які використовуються найчастіше).
Таблиця 1. Деякі конструктори класу SortedList<TKey,TValue>
Ім’я |
Опис |
SortedList<TKey, TValue>() |
Ініціалізує новий порожній екземпляр класу SortedList<TKey, TValue> з початковою місткістю за замовчанням, використовуючи інтерфейс IComparer<T> за замовчанням. |
SortedList<TKey, TValue>(IComparer<TKey>) |
Ініціалізує новий порожній екземпляр класу SortedList<TKey, TValue> з початковою місткістю за замовчанням, що використовує вказаний компаратор IComparer<T>. |
Таблиця 2. Властивості класу SortedList<TKey,TValue>
Ім’я |
Опис |
Capacity |
Повертає або задає кількість елементів, яку може містити клас SortedList<TKey, TValue>. |
Comparer |
Отримує інтерфейс IComparer<T> для відсортованого списку. |
Count |
Повертає кількість пар "ключ-значення", SortedList, що містяться в словнику<TKey, TValue>. |
Item |
Отримує або задає значення, пов'язане із заданим ключем. |
Keys |
Отримує колекцію, що містить ключі в SortedList<TKey, TValue>, відсортовані в порядку TKey. |
Values |
Отримує колекцію, що містить значення в об'єкті SortedList<TKey, TValue>. |
Таблиця 3. Деякі методи класу SortedList<TKey,TValue>
Ім’я |
Опис |
Add |
Додає елемент з вказаним ключем і значенням в SortedList<TKey, TValue>. |
Clear |
Видаляє усі елементи з колекції SortedList<TKey, TValue>. |
ContainsKey |
Визначає, чи містить об'єкт SortedList<TKey, TValue> вказаний ключ. |
ContainsValue |
Визначає, чи містить колекція SortedList<TKey, TValue> вказане значення. |
Equals(Object) |
Визначає, чи рівний заданий об'єкт поточному об'єкту. (Успадковано від Object.) |
Finalize |
Дозволяє об'єкту спробувати звільнити ресурси і виконати інші операції очищення, перш ніж об'єкт буде знищеним в процесі збирання сміття. (успадковано від Object.) |
GetEnumerator |
Повертає нумератор, що здійснює перебір елементів списку SortedList<TKey, TValue>. |
GetHashCode |
Грає роль хеш-функції для певного типу.(Успадковано від Object.) |
GetType |
Повертає об'єкт Type для поточного екземпляра. (успадковано від Object.) |
IndexOfKey |
Здійснює пошук вказаного ключа і повертає індекс (з нуля) для ключа, знайденого в межах усього класу SortedList<TKey, TValue>. |
IndexOfValue |
Здійснює пошук вказаного значення і повертає індекс (з нуля) першого входження, знайденого в межах усього класу SortedList<TKey, TValue>. |
MemberwiseClone |
Створює неповну копію поточного об'єкту Object. (Успадковано від Object.) |
Remove |
Видаляє елемент з вказаним ключем з SortedList<TKey, TValue>. |
RemoveAt |
Видаляє елемент списку SortedList<TKey, TValue> з вказаним індексом. |
ToString |
Повертає рядок, що представляє поточний об'єкт. (Успадковано від Object.) |
TrimExcess |
Встановлює місткість рівною фактичній кількості елементів в SortedList<TKey, TValue>, якщо ця кількість складає менше 90 відсотків поточної місткості. |
TryGetValue |
Набуває значення, пов'язаного з вказаним ключем. |