Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- namespace d1
- {
- // Клас за представяне на речник
- public class Dictionary<TKey, TValue>
- {
- // Поле за съхранение на елементите на речника в хеш-таблица
- private List<KeyValuePair<TKey, TValue>>[] table;
- // Поле за съхранение на броя на елементите в речника
- private int count;
- // Конструктор с параметър за капацитета на речника
- public Dictionary(int capacity)
- {
- // Създаваме нов масив от списъци с посочения капацитет
- table = new List<KeyValuePair<TKey, TValue>>[capacity];
- // Инициализираме всеки списък в масива
- for (int i = 0; i < capacity; i++)
- {
- table[i] = new List<KeyValuePair<TKey, TValue>>();
- }
- // Инициализираме броя на елементите с 0
- count = 0;
- }
- // Метод за проверка дали речникът е празен
- public bool IsEmpty()
- {
- return count == 0;
- }
- // Метод за проверка дали речникът е пълен
- public bool IsFull()
- {
- return count == table.Length;
- }
- // Метод за хеширане на ключове
- private int Hash(TKey key)
- {
- // Използваме стандартния метод GetHashCode на типа TKey и взимаме остатъка при деление на дължината на масива
- return Math.Abs(key.GetHashCode()) % table.Length;
- }
- // Метод за добавяне на двойка ключ-стойност в речника
- public void Add(TKey key, TValue value)
- {
- // Проверяваме дали речникът е пълен
- if (IsFull())
- {
- // Ако е пълен, хвърляме изключение
- throw new InvalidOperationException("Речникът е пълен.");
- }
- // Хешираме ключа и получаваме индекс в масива
- int index = Hash(key);
- // Обхождаме списъка на този индекс
- foreach (var pair in table[index])
- {
- // Ако намерим двойка със същия ключ
- if (pair.Key.Equals(key))
- {
- // Хвърляме изключение, защото не можем да имаме повтарящи се ключове в речника
- throw new ArgumentException("Вече съществува елемент с такъв ключ.");
- }
- }
- // Създаваме нова двойка ключ-стойност
- var newPair = new KeyValuePair<TKey, TValue>(key, value);
- // Добавяме я в края на списъка на този индекс
- table[index].Add(newPair);
- // Увеличаваме броя на елементите с 1
- count++;
- }
- // Метод за премахване на двойка ключ-стойност от речника по зададен ключ
- public void Remove(TKey key)
- {
- // Проверяваме дали речникът е празен
- if (IsEmpty())
- {
- // Ако е празен, хвърляме изключение
- throw new InvalidOperationException("Речникът е празен.");
- }
- // Хешираме ключа и получаваме индекс в масива
- int index = Hash(key);
- // Обхождаме списъка на този индекс
- for (int i = 0; i < table[index].Count; i++)
- {
- // Ако намерим двойка със същия ключ
- if (table[index][i].Key.Equals(key))
- {
- // Премахваме я от списъка
- table[index].RemoveAt(i);
- // Намаляваме броя на елементите с 1
- count--;
- // Прекратяваме метода
- return;
- }
- }
- // Ако не сме намерили двойка със същия ключ
- throw new KeyNotFoundException("Няма елемент с такъв ключ.");
- }
- // Метод за връщане на стойността на двойка ключ-стойност от речника по зададен ключ
- public TValue Get(TKey key)
- {
- // Проверяваме дали речникът е празен
- if (IsEmpty())
- {
- // Ако е празен, хвърляме изключение
- throw new InvalidOperationException("Речникът е празен.");
- }
- // Хешираме ключа и получаваме индекс в масива
- int index = Hash(key);
- // Обхождаме списъка на този индекс
- foreach (var pair in table[index])
- {
- // Ако намерим двойка със същия ключ
- if (pair.Key.Equals(key))
- {
- // Връщаме стойността на двойката като резултат от метода
- return pair.Value;
- }
- }
- // Ако не сме намерили двойка със същия ключ
- throw new KeyNotFoundException("Няма елемент с такъв ключ.");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement