Добрый день решаю задачу про вложенные итераторы.
Задача:
реализовать класс с методом 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
, то вы вернете ноль. Правильно ли это? Как это обработать со стороны вызова?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня имеется несколько Activity и ListFragment "Избранное"Мне требуется чтобы в каждом Activity в action_bar была звездочка, которая изменяет свою картинку(картинки...
Разворачиваю свое приложение RoR на сервере NginxВ проекте использую jQuery Raty
Всем приветРеализовал полет картинки товара в корзину, все работает нормально