package com.yoursway.common; import java.util.Iterator; public class StringTupleIterable implements Iterable<String[]> { private final static class TupleIterator implements Iterator<String[]> { private final Iterable<String>[] elements; private final Iterator<String>[] iterators; private final String[] values; private boolean hasNext = true; @SuppressWarnings("unchecked") public TupleIterator(Iterable<String>[] elements) { this.elements = elements; iterators = (Iterator<String>[]) new Iterator<?>[elements.length]; values = new String[elements.length]; resetIteratorsStartingWith(0); } public boolean hasNext() { return hasNext; } public String[] next() { String[] result = new String[values.length]; System.arraycopy(values, 0, result, 0, values.length); advance(); return result; } private void advance() { int incr = findRightmostIteratorThatHasNextValue(); if (incr < 0) hasNext = false; else { values[incr] = iterators[incr].next(); resetIteratorsStartingWith(incr + 1); } } private int findRightmostIteratorThatHasNextValue() { int nextIterator = -1; for (int i = iterators.length - 1; i >= 0; i--) if (iterators[i].hasNext()) { nextIterator = i; break; } return nextIterator; } public void remove() { throw new UnsupportedOperationException(); } private void resetIteratorsStartingWith(int index) { for (int i = index; i < iterators.length; i++) { iterators[i] = elements[i].iterator(); if (!iterators[i].hasNext()) hasNext = false; else values[i] = iterators[i].next(); } } } private final Iterable<String>[] elements; public StringTupleIterable(Iterable<String>[] elements) { this.elements = elements; } public Iterator<String[]> iterator() { return new TupleIterator(elements); } }