Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора? - C#

Узнай цену своей работы

Формулировка задачи:

Пытался сдать лабу преподавателю, суть которой в открытом хешировании, создал свой словарь (класс Dict (перебор через элемент head и tail)) и следовательно элемент словаря (класс DictNode (поля: key, value, next (ссылка на следующий элемент))). Вроде как всё сделал (как мне показалось), описал свой индексатор (в классе Dict), в котором проходил по элементам и искал следовательно элемент с таким ключом, т.е. делал перебор. Дак вот преподаватель мне сказал, что я должен получать данные словаря по ключу, БЕЗ перебора, то есть как-то по ссылке, что я не понял. К примеру, я передаю в метод ключ типа int, и каким образом я должен организовать мой словарь, чтобы получить без перебора значение элемента по этому ключу. Надеюсь я не запутал, искал всякое в инете и увидел, то что я прикреплю на скрине. Там оборачивается массив под якобы "своей" коллекцией и просто обращается по индексу к этому внутреннему стандартному массиву. Как по мне, это не совсем своя реализация, меня интересует как именно мне организовать свою коллекцию, чтобы я мог делать, то что я описал выше, если такое возможно. Просветите дурака пожалуйста, спасибо.

Решение задачи: «Как в индексаторе моей реализации "словаря" получить элемент словаря без перебора?»

textual
Листинг программы
  public class Dict<TK, TV>
  {
    private class Entry
    {
      public readonly TK Key;
      public TV Value;
 
      public Entry Next;
 
      public Entry(TK key, TV value)
      {
        Key = key;
        Value = value;
      }
    }
 
    private int _count;
    private Entry[] _entries;
 
    public Dict()
    {
      _entries = new Entry[100];
    }
 
    public void Add(TK key, TV value)
    {
      var index = Math.Abs(key.GetHashCode()) % _entries.Length;
      var entry = _entries[index];
      if (entry == null)
      {
        _entries[index] = new Entry(key, value);
      }
      else
      {
        var e = entry;
        while (true)
        {
          if (e.Key.Equals(key))
            throw new ArgumentException("key already added");
          if (e.Next == null)
            break;
          e = e.Next;
        }
        e.Next = new Entry(key, value);
      }
      _count++;
    }
 
    public TV this[TK key]
    {
      get
      {
        var index = Math.Abs(key.GetHashCode()) % _entries.Length;
        var entry = _entries[index];
        if (entry == null)
          throw new KeyNotFoundException();
 
        var e = entry;
        while (true)
        {
          if (e.Key.Equals(key))
            return e.Value;
 
          if (e.Next == null)
            throw new KeyNotFoundException();
          e = e.Next;
        }
      }
    }
  }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5
Похожие ответы