Wednesday, October 14, 2015

[7.16-7.18] collapses a list of Iterators into a single Iterator

1. Implementation

// NOTE: This means that the currentIterator
// reference could potentially advance several iterators before
// finding one where the hasNext method
// returns true, but the recursion will take care of that.
public boolean hasNext() {
if(!currentIterator.hasNext()) {
if (!listIterator.hasNext()) {
return false;
}
currentIterator = listIterator.next();
hasNext();
}
return true;

}

final Iterator<Integer> a = Arrays.asList(1, 2, 3, 4, 5).iterator();
final Iterator<Integer> b = Arrays.asList(6).iterator();
final Iterator<Integer> c = new ArrayList<Integer>().iterator();
final Iterator<Integer> d = new ArrayList<Integer>().iterator();

final Iterator<Integer> e = Arrays.asList(7, 8, 9).iterator();



assertTrue(signleIterator.hasNext() );
 for (Integer i = 1; i < =9 ; i++) 
    assertEquals( i, singleIterator.next() ); 
assertFalse( singleIterator.hasNext() );



public interface Iterator
{
      boolean hasNext();
      E next();
      void remove();
}



//public static  Iterator singleIterator( final //List> iteratorList)
//{
//}



// Main function listIterator operates as a single iterator
// Implement Iterator interface 
public static class ListIterator implements Iterator
{



     // boolean hasNext();
     // E next();
     // void remove();



     // Field
     private final Iterator> listIterator;
     private Iterator currentIterator;






     // Constructor: make list iterator into Iterator>
     public ListIterator( List> iterators)
     {
          this.listIterator = iterators.iterator();
          this.currentIterator = listIterator.next();
     }






// NOTE: This means that the currentIterator
// reference could potentially advance several iterators before 
// finding one where the hasNext method
// returns true, but the recursion will take care of that.
     @Override
     public boolean hasNext()
     {
          // CurrentIterator has no next
          if ( !currentIterator.hasNext() )
          {  
               // set up next iterator as currentIterator
               if ( !listIterator.hasNext()  )
                     return false;
               currentIterator = listITerator.next();
               // NOTE: recurse to check if next still has no next
               hasNext();
          }


          return true;


     }
     //public  next()
     public T next()
     {
          hasNext();
          return currentIterator.next();
     }
     // public boolean remove()
     public void remove()
     {
          hasNext();
          currentIterator.remove();
     }






}
@Test
public void multipleIteratorsTest()
{




      final Iterator a = Arrays.asList(1,2,3,4,5).iterator();
      final Iterator b= Arrays.asList(6).iterator();
      final Iterator c = new ArrayList().iterator();
      final Iterator d = new ArrayList().iterator();
      final Iterator e = Arrays.asList(7,8,9).iterator();
      




      final Iterator singleIterator = Iterators.singleIterator( Arrays.asList(a,b,c,d,e));
      assertTrue(signleIterator.hasNext() );
      for (Integer i = 1; i < =9 ; i++)
           assertEquals( i, singleIterator.next()  );

      assertFalse(  singleIterator.hasNext() );



} 

No comments:

Post a Comment