C3.AI | Virtual OnSite | Merge K Iterators
Anonymous User
1045

Given a list of k iterators. Implement MergingIterator to merge them. If you are not familiar with Iterators check similar questions.

class MergingIterator implements Iterator<Integer> {
	public MergingIterator(List<Iterator<Integer>> iterators) {
	}

	public boolean hasNext() {
	}

	public Integer next() {
	}
}

Example

MergingIterator itr = new MergingIterator([[2, 11, 9], [4, 10]]);
itr.hasNext(); // true
itr.next(); // 2
itr.next(); // 4
itr.next(); // 11
itr.next(); // 10
itr.next(); // 9
itr.hasNext(); // false
itr.next(); // error

This is similar to merge K sorted iterator but I am not able to figure out how to do this using Java.

I gave below solution but it does sorting:

class MergingIterator implements Iterator<Integer> {

    private final Map<Iterator<Integer>, Integer> curMap;
    private final Queue<Iterator<Integer>> iteratorQueue;

    public MergingIterator(List<Iterator<Integer>> iterators) {
        this.curMap = new HashMap<>();
        this.iteratorQueue = new PriorityQueue<>(Comparator.comparingInt(this.curMap::get));
        for (Iterator<Integer> iter : iterators) {
            if (iter.hasNext()) {
                curMap.put(iter, iter.next());
                this.iteratorQueue.add(iter);
            }
        }
    }

    public boolean hasNext() {
        return !iteratorQueue.isEmpty();
    }

    public Integer next() {
        if (iteratorQueue.isEmpty()) {
            throw new NoSuchElementException("Iterator is empty");
        }

        Iterator<Integer> iter = iteratorQueue.poll();

        Integer res = curMap.get(iter);

        if (iter.hasNext()) {
            curMap.put(iter, iter.next());
            iteratorQueue.add(iter);
        }

        return res;
    }

}

Can someone modify above code, so iterators gets merged not in sorted order?

Comments (4)