package edu.berkeley.nlp.util; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * Iterates over a list of lists, returning the (a list containing) the correspondings element in each list at each iteration. * Assumes each list has the same length. * * For example, * @author adpauls * * @param <T> */ public class CorrespondingIterable<T> implements Iterable<List<T>> { private Iterable<T>[] iterables; public CorrespondingIterable(Iterable<T>... iterables) { this.iterables = iterables; } private class ThisIterator implements Iterator<List<T>> { List<Iterator<T>> iters; public ThisIterator(Iterable<T>... iterables) { this.iters = new ArrayList<Iterator<T>>(); for (Iterable<T> iterable : iterables) { this.iters.add(iterable.iterator()); } } public boolean hasNext() { boolean allTrue = true; boolean someTrue = false; for (Iterator<T> iter : iters) { final boolean hasNext = iter.hasNext(); allTrue &= hasNext; someTrue |= hasNext; } if (someTrue && !allTrue) throw new IllegalStateException(this.getClass().getName() + " must have same length"); return allTrue; } public List<T> next() { List<T> retVal = new ArrayList<T>(); for (Iterator<T> iter : iters) { retVal.add(iter.next()); } return retVal; } public void remove() { throw new UnsupportedOperationException(); } } public Iterator<List<T>> iterator() { return new ThisIterator(this.iterables); } }