Как вернуть итератор по четным числам, заданный итератор по списку целых чисел? - PullRequest
3 голосов
/ 28 марта 2012

Мне задали этот вопрос в интервью по Java.Мне дали итератор для списка целых чисел.Мне нужно написать функцию, которая возвращает этот итератор в качестве аргумента и возвращает итератор только для четных чисел.Мне сказали, что я не могу изменить исходный список номеров.Следовательно, удаление нечетных чисел из списка не является решением.Пожалуйста, порекомендуйте.Спасибо.

Ответы [ 2 ]

10 голосов
/ 28 марта 2012

Ну, вам просто нужно создать новый итератор, который принимает существующий итератор и перезаписывает его методы 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;
}
0 голосов
/ 26 сентября 2014
Iterator<Integer> itr;
int cur;

OddIterator(Iterator<Integer> itr) {
    this.itr = itr;
    cur = 0;
}

public boolean hasNext() {
    if ((cur & 1) == 1) {
        return true;
    }
    while (itr != null && itr.hasNext()) {
        cur = itr.next();
        if ((cur & 1) == 1) {
            return true;
        }
    }
    return false;
}

public int next() {
    if (!hasNext()) {
        throw new NoSuchElementException();
    }
    int tmp = cur;
    cur = 0;
    return tmp;
}

Надеюсь, это поможет вам. Если есть какие-то ошибки с моим кодом. Пожалуйста, дайте мне знать.

...