284. Peeking Iterator

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next().

Example:

Assume that the iterator is initialized to the beginning of the list: 
[1,2,3]
.

Call 
next()
 gets you 
1
, the first element in the list.
Now you call 
peek()
 and it returns 
2
, the next element. Calling 
next()
 after that 
still
 return 
2
. 
You call 
next()
 the final time and it returns 
3
, the last element. 
Calling 
hasNext()
 after that should return 
false
.

Follow up: How would you extend your design to be generic and work with all types, not just integer?

Solution

(1) Java

// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
class PeekingIterator implements Iterator<Integer> {

    private Iterator<Integer> iter = null;
    private boolean hasNextInt = false;
    private Integer nextInt = 0;

    public PeekingIterator(Iterator<Integer> iterator) {
        // initialize any member here.
        iter = iterator;
    }

    // Returns the next element in the iteration without advancing the iterator.
    public Integer peek() {
        if (hasNext()) {
            return nextInt;
        }
        return null;
    }

    // hasNext() and next() should behave the same as in the Iterator interface.
    // Override them if needed.
    @Override
    public Integer next() {
        if (hasNext()) {
            hasNextInt = false;
            return nextInt;
        }
        return null;
    }

    @Override
    public boolean hasNext() {
        if (!hasNextInt) {
            hasNextInt = iter.hasNext();
            if (hasNextInt) {
                nextInt = iter.next();
            }
        }
        return hasNextInt;
    }
}

(2) Python

class PeekingIterator(object):
    def __init__(self, iterator):
        self.iter = iterator
        self.temp = self.iter.next() if self.iter.hasNext() else None

    def peek(self):
        return self.temp

    def next(self):
        ret = self.temp
        self.temp = self.iter.next() if self.iter.hasNext() else None
        return ret

    def hasNext(self):
        return self.temp is not None

(3) Scala



results matching ""

    No results matching ""