Advertisement
CR7CR7

Dictionary -d1

Jul 14th, 2023
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.27 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace d1
  5. {
  6.     // Клас за представяне на речник
  7.     public class Dictionary<TKey, TValue>
  8.     {
  9.         // Поле за съхранение на елементите на речника в хеш-таблица
  10.         private List<KeyValuePair<TKey, TValue>>[] table;
  11.  
  12.         // Поле за съхранение на броя на елементите в речника
  13.         private int count;
  14.  
  15.         // Конструктор с параметър за капацитета на речника
  16.         public Dictionary(int capacity)
  17.         {
  18.             // Създаваме нов масив от списъци с посочения капацитет
  19.             table = new List<KeyValuePair<TKey, TValue>>[capacity];
  20.  
  21.             // Инициализираме всеки списък в масива
  22.             for (int i = 0; i < capacity; i++)
  23.             {
  24.                 table[i] = new List<KeyValuePair<TKey, TValue>>();
  25.             }
  26.  
  27.             // Инициализираме броя на елементите с 0
  28.             count = 0;
  29.         }
  30.  
  31.         // Метод за проверка дали речникът е празен
  32.         public bool IsEmpty()
  33.         {
  34.             return count == 0;
  35.         }
  36.  
  37.         // Метод за проверка дали речникът е пълен
  38.         public bool IsFull()
  39.         {
  40.             return count == table.Length;
  41.         }
  42.  
  43.         // Метод за хеширане на ключове
  44.         private int Hash(TKey key)
  45.         {
  46.             // Използваме стандартния метод GetHashCode на типа TKey и взимаме остатъка при деление на дължината на масива
  47.             return Math.Abs(key.GetHashCode()) % table.Length;
  48.         }
  49.  
  50.         // Метод за добавяне на двойка ключ-стойност в речника
  51.         public void Add(TKey key, TValue value)
  52.         {
  53.             // Проверяваме дали речникът е пълен
  54.             if (IsFull())
  55.             {
  56.                 // Ако е пълен, хвърляме изключение
  57.                 throw new InvalidOperationException("Речникът е пълен.");
  58.             }
  59.  
  60.             // Хешираме ключа и получаваме индекс в масива
  61.             int index = Hash(key);
  62.  
  63.             // Обхождаме списъка на този индекс
  64.             foreach (var pair in table[index])
  65.             {
  66.                 // Ако намерим двойка със същия ключ
  67.                 if (pair.Key.Equals(key))
  68.                 {
  69.                     // Хвърляме изключение, защото не можем да имаме повтарящи се ключове в речника
  70.                     throw new ArgumentException("Вече съществува елемент с такъв ключ.");
  71.                 }
  72.             }
  73.  
  74.             // Създаваме нова двойка ключ-стойност
  75.             var newPair = new KeyValuePair<TKey, TValue>(key, value);
  76.  
  77.             // Добавяме я в края на списъка на този индекс
  78.             table[index].Add(newPair);
  79.  
  80.             // Увеличаваме броя на елементите с 1
  81.             count++;
  82.         }
  83.  
  84.         // Метод за премахване на двойка ключ-стойност от речника по зададен ключ
  85.         public void Remove(TKey key)
  86.         {
  87.             // Проверяваме дали речникът е празен
  88.             if (IsEmpty())
  89.             {
  90.                 // Ако е празен, хвърляме изключение
  91.                 throw new InvalidOperationException("Речникът е празен.");
  92.             }
  93.  
  94.             // Хешираме ключа и получаваме индекс в масива
  95.             int index = Hash(key);
  96.  
  97.             // Обхождаме списъка на този индекс
  98.             for (int i = 0; i < table[index].Count; i++)
  99.             {
  100.                 // Ако намерим двойка със същия ключ
  101.                 if (table[index][i].Key.Equals(key))
  102.                 {
  103.                     // Премахваме я от списъка
  104.                     table[index].RemoveAt(i);
  105.  
  106.                     // Намаляваме броя на елементите с 1
  107.                     count--;
  108.  
  109.                     // Прекратяваме метода
  110.                     return;
  111.                 }
  112.             }
  113.  
  114.             // Ако не сме намерили двойка със същия ключ
  115.             throw new KeyNotFoundException("Няма елемент с такъв ключ.");
  116.         }
  117.  
  118.         // Метод за връщане на стойността на двойка ключ-стойност от речника по зададен ключ
  119.         public TValue Get(TKey key)
  120.         {
  121.             // Проверяваме дали речникът е празен
  122.             if (IsEmpty())
  123.             {
  124.                 // Ако е празен, хвърляме изключение
  125.                 throw new InvalidOperationException("Речникът е празен.");
  126.             }
  127.  
  128.             // Хешираме ключа и получаваме индекс в масива
  129.             int index = Hash(key);
  130.  
  131.             // Обхождаме списъка на този индекс
  132.             foreach (var pair in table[index])
  133.             {
  134.                 // Ако намерим двойка със същия ключ
  135.                 if (pair.Key.Equals(key))
  136.                 {
  137.                     // Връщаме стойността на двойката като резултат от метода
  138.                     return pair.Value;
  139.                 }
  140.             }
  141.  
  142.             // Ако не сме намерили двойка със същия ключ
  143.             throw new KeyNotFoundException("Няма елемент с такъв ключ.");
  144.         }
  145.     }
  146. }
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement