Class CartesianProductIterator<E>

java.lang.Object
org.apache.commons.collections4.iterators.CartesianProductIterator<E>
Type Parameters:
E - the type of the objects being permuted
All Implemented Interfaces:
Iterator<List<E>>

public class CartesianProductIterator<E> extends Object implements Iterator<List<E>>
This iterator creates a Cartesian product of the input iterables, equivalent to nested for-loops.

The iterables provided to the constructor are used in reverse order, each until exhaustion before proceeding to the next element of the prior iterable and repeating. Consider the following example:


 List<Character> iterable1 = Arrays.asList('A', 'B', 'C');
 List<Character> iterable2 = Arrays.asList('1', '2', '3');
 CartesianProductIterator<Character> it = new CartesianProductIterator<>(
         iterable1,
         iterable2);
 while (it.hasNext()) {
     List<Character> tuple = it.next();
     System.out.println(tuple.get(0) + ", " + tuple.get(1));
 }
 

The output will be:

 A, 1
 A, 2
 A, 3
 B, 1
 B, 2
 B, 3
 C, 1
 C, 2
 C, 3
 

The remove() operation is not supported, and will throw an UnsupportedOperationException.

If any of the input iterables is empty, the Cartesian product will be empty. If any of the input iterables is infinite, the Cartesian product will be infinite.

Since:
4.5.0-M3
  • Constructor Details

  • Method Details

    • hasNext

      public boolean hasNext()
      Returns true if the iteration has more elements.
      Specified by:
      hasNext in interface Iterator<E>
      Returns:
      true if there are more tuples, otherwise false
    • next

      public List<E> next()
      Returns the next tuple of the input iterables.
      Specified by:
      next in interface Iterator<E>
      Returns:
      a list of the input iterables' elements
      Throws:
      NoSuchElementException - if there are no more tuples
    • remove

      public void remove()
      Specified by:
      remove in interface Iterator<E>