Write an algorithm that collapses a list of Iterators into a single Iterator - Java Program

Write an algorithm that collapses a list of Iterators into a single Iterator. 

package javacore;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class CollapseIterators {
 /**
  * @param args
  *            Write an algorithm that collapses a list of Iterators into a
  *            single Iterator.
  */
 public static void main(String[] args) {
  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();

  final Iterator<Integer> singleIterator = singleIterator(Arrays.asList(
    a, b, c, d, e));
  if (null != singleIterator && singleIterator.hasNext()) {
   System.out.println("Single Iterator obtained!!");
   while (singleIterator.hasNext()) {
    System.out.println(singleIterator.next().toString());
   }
  } else {
   System.out.println("Single Iterator did not obtained");
  }
 }

 public static <T> Iterator<T> singleIterator(
   final List<Iterator<T>> iteratorList) {
  ListIterator<T> it = new ListIterator<>(iteratorList);
  return it;

 }
}

class ListIterator<T> implements Iterator<T> {
 // Field
 private final Iterator<Iterator<T>> listIterator;
 private Iterator<T> currentIterator;

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

 @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 T next() {
  hasNext();
  return currentIterator.next();
 }

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

Sample Output:-
 
Single Iterator obtained!!
1
2
3
4
5
6
7
8
9

Problem reference: "Java Programming Interviews Exposed"

Related Question:
How can we achieve this behaviour using Google Guava collections framework ?

8 Comments

  1. This comment has been removed by the author.

    ReplyDelete
  2. informative blog , keep posting and if you are intresting in code developer then checkout python classes in satara

    ReplyDelete

  3. Wie können Unternehmen ihre cybersecurity weiterbildung im Bereich ransomware-prävention effektiv gestalten? Ein wichtiger Schritt ist die regelmäßige Erstellung und Pflege von Backups, die auf separaten Servern gespeichert werden. Laut BSI TR-03111 sollte die Sicherungskopie mindestens eine Kopie außerhalb des Netzwerks enthalten, um im Falle eines Angriffs schnell wieder arbeiten zu können. Segmentierung des Netzwerks verhindert die Ausbreitung von Schadsoftware und schützt sensible Daten. Zudem bietet der Einsatz einer Endpoint Detection and Response Lösung (EDR) eine kontinuierliche Überwachung und schnelle Reaktion bei verdächtigen Aktivitäten, was bei Angriffen wie MOVEit oder LockerGoga entscheidend sein kann. Durch diese Maßnahmen steigt die Wahrscheinlichkeit, Ransomware-Erpressung erfolgreich abzuwehren; zusätzliche Informationen finden sich unter csvisor.de.

    ReplyDelete
Previous Post Next Post