Добрый день решаю задачу про вложенные итераторы.
Задача:
реализовать класс с методом 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;
}
};
}
}
почему итератор проходит только по первому массиву чисел а на второй не переходит ? не пойму что тут не так .
main.next(); возвращает следующий элемент, почему вы его игнорируете?
boolean temp = false; - это у вас поле объекта Iterator установив его в true в hasNext(), вы потом всегда возвращаете true
В итераторе метод next() не должен вызывать метод hasNext() сам, это делает тот кто использует итератор.
При этом если main.hasNext() вернет вам false, то вы вернете ноль. Правильно ли это? Как это обработать со стороны вызова?
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники