package com.revolsys.collection.range; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import com.revolsys.collection.iterator.AbstractIterator; import com.revolsys.util.Strings; public class CrossProductRangeIterator extends AbstractIterator<String> { private final List<String> currentValues = new ArrayList<>(); private List<Iterator<? extends Object>> iterators = new ArrayList<>(); private final CrossProductRange range; public CrossProductRangeIterator(final CrossProductRange range) { this.range = range; for (final AbstractRange<?> subRange : range.getRanges()) { final Iterator<?> iterator = subRange.iterator(); if (iterator.hasNext()) { final Object value = iterator.next(); this.currentValues.add(value.toString()); this.iterators.add(iterator); } else { this.iterators.add(null); this.currentValues.add(null); } } if (this.iterators.isEmpty()) { this.iterators = null; } } @Override protected String getNext() throws NoSuchElementException { if (this.iterators == null) { throw new NoSuchElementException(); } else { final String value = Strings.toString("", this.currentValues); updateValues(); return value; } } private void updateValues() { for (int i = this.iterators.size() - 1; i > -1; i--) { Iterator<? extends Object> iterator = this.iterators.get(i); if (iterator == null) { } else if (iterator.hasNext()) { final Object value = iterator.next(); this.currentValues.set(i, value.toString()); return; } else { iterator = this.range.getRange(i).iterator(); this.iterators.set(i, iterator); String value = null; if (iterator.hasNext()) { value = iterator.next().toString(); } else { iterator = null; } this.currentValues.set(i, value); this.iterators.set(i, iterator); } } this.iterators = null; } }