Вложенные итераторы

161
04 марта 2018, 23:57

Добрый день решаю задачу про вложенные итераторы.

Задача: реализовать класс с методом Iterator<Integer> onvert(Iterator<Iterator<Integer>> it).

Что из себя представляет запись Iterator<Iterator<Integer>?.

Каждый итератор это последовательность.

Итератор 1 – 4 2 0 4 6 4 9

Итератор 2 – 0 9 8 7 5

Итератор 3 – 1 3 5 6 7 0 9 8 4

Если мы говорим о записи Итератор Итераторов. Значит итератор содержит не конечные значения, а сложенные итераторы.

Итератор - Итератор 1, Итератор 2, Итератор 3.

Метод convert должен принимать объект итератор итератор и возвращать Итератор чисел.

Iterator<Iterator<Integer> - ((4 2 0 4 6 4 9), (0 9 8 7 5), (1 3 5 6 7 0 9 8 4))

Метод должен возвращать

Iterator<Integer> - (4 2 0 4 6 4 9 0 9 8 7 5 1 3 5 6 7 0 9 8 4)

Метод не должен копировать данные. Нужно реализовать итератор, который будет пробегать по вложенными итераторам без копирования данных.

Шаблон класса

public class Converter {
   Iterator<Integer> convert(Iterator<Iterator<Integer>> it) {
      return new Iterator<Integer>() {
        @Override
        public boolean hasNext() {
           return false;
        }
        @Override
        public Integer next() {
           return null;
        }
     };
   }
}

Тест

    Iterator<Integer> it;
    @Before
    public void setUp () {
        Iterator<Integer> it1 = Arrays.asList(1, 2, 3).iterator();
        Iterator<Integer> it2 = Arrays.asList(4, 5, 6).iterator();
        Iterator<Integer> it3 = Arrays.asList(7, 8, 9).iterator();
        Iterator<Iterator<Integer>> its = Arrays.asList(it1, it2, it3).iterator();
        IteratorIterator IteratorOfIterators = new IteratorIterator();
        it = IteratorOfIterators.convert(its);
    }

    @Test
    public void hasNextNextSequentialInvocation () {
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(1));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(2));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(3));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(4));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(5));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(6));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(7));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(8));
        assertThat(it.hasNext(), is(true));
        assertThat(it.next(), is(9));
        assertThat(it.hasNext(), is(false));
    }

Мой код:

public class IteratorIterator implements Iterator<Integer> {

    @Override
    public boolean hasNext() {
        return false;
    }
    @Override
    public Integer next() {
        return null;
    }
    Iterator<Integer> convert(Iterator<Iterator<Integer>> it) {
        Iterator<Iterator<Integer>> main = it;
        Iterator<Integer> iter = main.next();
        return new Iterator<Integer>() {
            boolean temp = false;
            @Override
            public boolean hasNext() {
                if (main.hasNext()) {
                    if (iter.hasNext()) {
                        temp = true;
                    }
                    else {
                      main.next();
                        hasNext();
                    }
                }
                return temp;
            }
            @Override
            public Integer next() {
                int temp = 0;
                if (main.hasNext()) {
                    if (iter.hasNext()) {
                        temp = iter.next();
                    } else {
                        main.next();
                    }
                }
                return temp;
            }

        };
    }
}

почему итератор проходит только по первому массиву чисел а на второй не переходит ? не пойму что тут не так .

Answer 1

main.next(); возвращает следующий элемент, почему вы его игнорируете?

boolean temp = false; - это у вас поле объекта Iterator установив его в true в hasNext(), вы потом всегда возвращаете true

В итераторе метод next() не должен вызывать метод hasNext() сам, это делает тот кто использует итератор.

При этом если main.hasNext() вернет вам false, то вы вернете ноль. Правильно ли это? Как это обработать со стороны вызова?

READ ALSO
Как сделать &ldquo;избранное&rdquo;?

Как сделать “избранное”?

У меня имеется несколько Activity и ListFragment "Избранное"Мне требуется чтобы в каждом Activity в action_bar была звездочка, которая изменяет свою картинку(картинки...

151
Punto Switcher не работает в NetBeans

Punto Switcher не работает в NetBeans

Windows 10 Pro x64 Punto Switcher 43

242
Сервер Nginx не отображает jQuery Raty - Ruby on Rails

Сервер Nginx не отображает jQuery Raty - Ruby on Rails

Разворачиваю свое приложение RoR на сервере NginxВ проекте использую jQuery Raty

160
Полет картинки в корзину?

Полет картинки в корзину?

Всем приветРеализовал полет картинки товара в корзину, все работает нормально

172