diff --git a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java index 678f4f5..5eac3b5 100755 --- a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java +++ b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java @@ -9,9 +9,9 @@ public class RectangleSpliterator extends Spliterators.AbstractIntSpliterator { private final int innerLength; private final int[][] array; - private final int startOuterInclusive; + private int startOuterInclusive; private final int endOuterExclusive; - private final int startInnerInclusive; + private int startInnerInclusive; public RectangleSpliterator(int[][] array) { this(array, 0, array.length, 0); @@ -29,18 +29,33 @@ private RectangleSpliterator(int[][] array, int startOuterInclusive, int endOute @Override public OfInt trySplit() { - // TODO - throw new UnsupportedOperationException(); + final int outerLen = endOuterExclusive - startOuterInclusive; + if (outerLen <= 1) return null; + final int outerMid = startOuterInclusive + outerLen / 2; + + final RectangleSpliterator res = new RectangleSpliterator(array, startOuterInclusive, outerMid, startInnerInclusive); + startOuterInclusive = outerMid; + return res; } + @Override public long estimateSize() { - return ((long) endOuterExclusive - startOuterInclusive)*innerLength - startInnerInclusive; + return ((long) endOuterExclusive - startOuterInclusive) * innerLength - startInnerInclusive; } @Override public boolean tryAdvance(IntConsumer action) { - // TODO - throw new UnsupportedOperationException(); + if (startOuterInclusive >= endOuterExclusive + && startInnerInclusive >= innerLength) + return false; + + for (int i = startInnerInclusive; i < innerLength; i++) { + final int value = array[startOuterInclusive][startInnerInclusive]; + startInnerInclusive++; + action.accept(value); + } + + return true; } }