Ну, вам просто нужно создать новый итератор, который принимает существующий итератор и перезаписывает его методы hasNext и next. Единственная трудность состоит в том, что итератор с хорошим поведением, очевидно, должен занимать только пространство O (1), поэтому создаем новый список и используем его в плохом стиле - поэтому нам нужно немного вести бухгалтерию. Что-то вроде следующего - упрощенный псевдокод без обработки ошибок, принятие нулевого значения в качестве недопустимого значения и т. Д., Но для более общего решения - должно дать вам основную идею:
Iterator<T> it;
T next;
NewIterator(Iterator<T> it) {
this.it = it;
setNext();
}
void setNext() {
while (it.hasNext()) {
T val = it.next();
if (validT(val)) {
next = val;
return;
}
}
next = null; // lets assume null is invalid.
}
boolean hasNext() {
return next != null;
}
T next() {
T ret = next;
setNext();
return ret;
}