package ch.akuhn.foreach; import static java.lang.Math.max; import java.util.Iterator; import java.util.NoSuchElementException; public class Interval implements Iterable<Integer> { public final int end; public final int start; public final int step; public Interval(final int start, final int end, final int step) { if (step == 0 && start != end) throw new IllegalArgumentException(); this.end = end; this.step = step; this.start = start; } //@Override public final Iterator<Integer> iterator() { return new Iterator<Integer>() { private int index = start; public final boolean hasNext() { return step > 0 ? index < end : index > end; } public final Integer next() { if (!hasNext()) throw new NoSuchElementException(); int current = index; index += step; return current; } public final void remove() { throw new UnsupportedOperationException(); } }; } public int size() { return step == 0 ? 0 : max(0, (end - start + step + (step < 0 ? +1 : -1)) / step); } public int[] asArray() { int[] array = new int[size()]; Iterator<Integer> it = iterator(); for (int n = 0; n < array.length; n++) array[n] = it.next(); assert !it.hasNext(); return array; } }