Custom Iterator

Albert Davletov
UniLecs
Published in
2 min readOct 7, 2021

Задача: дан вложенный список целых чисел NestedList:

  • каждый элемент представляет собой целое число или список, элементы которого также могут быть целыми числами или другими списками.

Необходимо реализовать итератор CustomIterator:

класс CustomIterator:

  • CustomIterator(List<NestedInteger> nestedList) — конструктор, ктр инициализирует итератор вложенным списком nestedList.
  • int Next() — метод класса, ктр возвращает следующее целое число во вложенном списке.
  • boolean hasNext() — метод, ктр возвращает true, если во вложенном списке все еще есть целые числа, и false в противном случае.

Примеры:

  1. NestedList = [[1, 1], 2, [1, 1]]
    Output: [1, 1, 2, 1, 1]
  2. NestedList = [1, [4, [6]]]
    Output: [1, 4, 6]

Разбор

Самый простой способ решить эту задачу — это превратить вложенный список в обычный одномерный список. Как это сделать?!

Можно воспользоваться рекурсией: будем проходит по вложенному списку и добавлять в результирущий массив элемент, если это простое число, если же мы встретили вложенный список, то вызываем рекурсию с этим списком.

Таким образом по окончанию основного цикла в результирующем массиве мы получим все элементы, порядок элементов также сохраниться, т.к. мы проходим слева направо.

Далее все просто: мы просто заведем глобальную переменную, которая будет следить за позицией текущего элемента в итераторе. Эту переменную используем в методах HasNext и Next.

Детали реализации смотрите в коде!

Реализация

C#

https://gist.github.com/unilecs/669e9ee2fcdd8c1d8d719d8d1bd8bbce

Play-test

https://dotnetfiddle.net/GKEGUo

--

--