Skip to main content

Flatten Iterator

Problem: Given an iterator of iterators, can you give me back an iterator which flattens the given iterator. Ex : Suppose you are given an iterator which has these objects - "1", "2", "3", , , then the flattened iterator returned by you should have "1", "2", "3", "4", "5", "6", "7", "8", "9". Iterators may be nested to any level.


This problem can be solved by implementing a FlattenIterator which takes in the given iterator as an agrument in the constructor and delegating the hasNext() and next() calls to the given iterator using a stack. The given iterator is pushed on to the stack. Nested iterators are pushed on to the stack before traversing and once there are no more elements in the iterator, it is popped from the stack. Here is the code -


import java.util.*;

/**
* User: blogkoder
* Date: Jul 28, 2008
* Time: 9:32:39 PM
*/
public class FlattenIterator implements Iterator
{
private final Stack<Iterator<?>> iterators = new Stack<Iterator<?>>();

private boolean hasNextCalled;
private boolean hasNextValue;
private Object next;

/**
* Default constructor which takes in an iterator.
* @param iterator
* @throws RuntimeException - if iterator is null.
*/
public FlattenIterator(Iterator iterator)
{
if (iterator == null)
{
throw new RuntimeException("Iterator cannot be null.");
}

iterators.push(iterator);
}

public boolean hasNext()
{
boolean hasNext = false;

if (hasNextCalled)
{
hasNext = hasNextValue;
}
else
{
iterateNext();

hasNextCalled = true;

hasNext = (next != null);

hasNextValue = hasNext;
}

return hasNext;
}

private void iterateNext()
{
if (!iterators.empty())
{
if (iterators.peek().hasNext())
{
next = iterators.peek().next();

if (next instanceof Iterator)
{
iterators.push((Iterator) next);

iterateNext();
}
}
else
{
iterators.pop();

iterateNext();
}
}
else
{
next = null;
}
}

public Object next()
{
Object returnValue = null;

if (hasNextCalled)
{
hasNextCalled = false;
returnValue = next;
}
else
{
iterateNext();

returnValue = next;
}

if (returnValue == null)
{
throw new NoSuchElementException();
}

return returnValue;
}

public void remove()
{

}
}

Comments

Popular posts from this blog

Find the number of trailing zeroes in the factorial of a given number.

Problem : Find the number of trailing zeroes in the factorial of a given number. This is an interesting problem. Simple way to solve this is to find the factorial of the number and then count the number of trailing zeroes. But there is a more efficient way to find the number of trailing zeroes, without even finding the factorial of the number. The number of trailing zeroes in 5! is 1, 10! is 2, 15! is 3, 20! is 4, but 25! is 6. Then 30! is 7, 35! is 8, 40! is 9, 45! is 10 but 50! is 12 and so on. So for every multiple of 25, the number of zeroes increases by 2 and for every multiple of 5, the number of zeroes increase by 1. So any number less than 5 has 0 trailing zeroes. Any number between 5 and 10 will have 1 zero, between 10 and 15 will have 2 zeroes and so on. Here is a simple C program implementation of this algorithm. import java.io.BufferedReader; import java.io.InputStreamReader; /** * * @author blogkoder * */ public class TrailingZeroesCalculator { public static void m...

Minimum Maximum Stack

Problem : Design a stack of Numbers which will give you the minimum and maximum of all the elements it contains. This problem is also known as MinStack or MaxStack problem which expects you to find only the minimum or maximum. It is restated here to capture both. A stack typically has push(), pop() and size() operations. In order to find the minimum and the maximum, we will need to iterate over the elements of the stack each time we want to find the minimum and maximum. This will result in O (n) time complexity. And typically stack does not let us iterate over the elements. Many do not know that the java.util.Stack implementation does allow it as it extends java.util.Vector. We can make it more efficient by storing the minimum and maximum as instance variables in our stack and update them when ever we push a new number on to the stack. This will result in O(1) complexity for updating the max and min when pushing new numbers on stack, but when we pop the number which is currently set a...

Find missing integer problem

Problem : G iven an array of size 99 which has integers from 1 to 100 and with no integer being repeated, can you find the integer which is not in the array ? There are many differeny ways of solving this problem. The most efficient solution is to just find the difference between the sum of all integers from 1 to 100 and the sum of all integers in the array. This algorithm has a running complexity of  O (n)  and a space complexity of  O (1)  since it just needs 2 variables to store the sums . Here is the code for this -   /**      * This will find the missing integer in the given array of size 99.      *      * The array has integers between 1 and 100 with one integer      * missing.      *      * @param array - Array of integers b/w 1 and 100 of size 99.      * @return int - the missing integer number.      */     public static int findMissingInteger(int[] array)     {         int sum = 0;          // This has the complexity of O (n)         for (int i = 0; i         {             sum...