How to return an iterator over even numbers, given an iterator over a list of integers?

I was asked this question in a java interview. I am assigned an iterator for a list of integers. I need to write a function that returns this iterator as an argument and returns an iterator for even numbers only. I was told I cannot change the original list of numbers. Hence, removing odd numbers from the list is not a solution. Please advise. Thank.

+3


source to share


2 answers


Well, you just need to create a new Iterator that takes an existing Iterator and overwrites its hasNext and the following methods. The only difficulty is that a good iterator that behaves nicely should obviously only use O (1) space, so creating a new list and using that bad style - hence we need a little bookkeeping. Something like the following, simplified pseudocode with no error handling, assuming null as an invalid value, etc., but for some general solution - should give you the basic idea:



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;
}

      

+9


source


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;
}

      



Hope this helps you. If there are any errors in my code. Please let me know.

0


source







All Articles