Java DeepCopy Iterator, не потребляя его - PullRequest
0 голосов
/ 08 мая 2018

Как я могу скопировать свой итератор на другой, не используя его? Или, по крайней мере, если я смогу сбросить индекс обратно к первому элементу после того, как смогу его использовать. Я ищу что-то вроде ниже, где он все равно должен печатать значения после копирования;

Iterator iter2=copy(iter1);

while(iter1.hasNext())
{
    System.out.println(iter1.next()); // Should print this, even after copy
}

1 Ответ

0 голосов
/ 08 мая 2018

Контракт Iterator должен быть «единственным прямым» способом итерации по серии объектов.

Как уже упоминалось в вашем комментарии, вы пытаетесь записать значения Iterator, но все же используете итератор в другом месте.

Вы можете сделать что-то хитрое, обернув Iterator пользовательским классом, который вызывает обернутый Iterator и регистрирует значения при вызове метода next.

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

Вы должны сконструировать это WrappedIterator, используя исходный Iterator в качестве параметра, а затем передать WrappedIterator коду, который его использует.

public class WrappedIterator<T> implements Iterator<T> {
    private Iterator<T> iterator;

    public WrappedIterator(Iterator<T> iterator) {
        this.iterator = iterator;
    }

    @Override
    public void remove() {
        this.iterator.remove();
    }

    @Override
    public boolean hasNext() {
        return this.iterator.hasNext();
    }

    @Override
    public T next() {
        T next = iterator.next();
        System.out.println(next);
        return next;
    }
}
...