From 376920ef2309d3b26c7d64d5a03ca20f16d905f2 Mon Sep 17 00:00:00 2001 From: Artem Semiashkin Date: Mon, 27 Feb 2017 12:24:30 +0300 Subject: [PATCH] p1 --- .../part1/exercise/RectangleSpliterator.java | 42 +++++++++++++++---- .../exercise/RectangleSpliteratorTest.java | 42 +++++++++++++++++++ 2 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java diff --git a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java index 678f4f5..a6ffa43 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,46 @@ private RectangleSpliterator(int[][] array, int startOuterInclusive, int endOute @Override public OfInt trySplit() { - // TODO - throw new UnsupportedOperationException(); + int l = endOuterExclusive - startOuterInclusive; + if(l <= 1) return null; + int m = startOuterInclusive + l / 2; + RectangleSpliterator rectangleSpliterator = + new RectangleSpliterator(array, startOuterInclusive, m, startInnerInclusive); + startOuterInclusive = m; + startInnerInclusive = 0; + return rectangleSpliterator; } @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 (startInnerInclusive >= innerLength) { + if (startOuterInclusive < endOuterExclusive - 1) { + startOuterInclusive += 1; + startInnerInclusive = 0; + } else { + return false; + } + } + action.accept(array[startOuterInclusive][startInnerInclusive]); + startInnerInclusive += 1; + return true; + } + + @Override + public void forEachRemaining(IntConsumer action) { + while (startOuterInclusive < endOuterExclusive) { + if (startInnerInclusive < innerLength) { + action.accept(array[startOuterInclusive][startInnerInclusive]); + startInnerInclusive += 1; + } else { + startOuterInclusive += 1; + startInnerInclusive = 0; + } + } } } diff --git a/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java b/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java new file mode 100644 index 0000000..3d1b90c --- /dev/null +++ b/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java @@ -0,0 +1,42 @@ +package spliterators.part1.exercise; + +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.StreamSupport; + +import static org.junit.Assert.assertEquals; + +public class RectangleSpliteratorTest { + private int[][] array; + + @Before + public void setup() { + int outerLength = 2; + array = new int[outerLength][]; + for (int i = 0; i < array.length; i++) { + int innerLength = 2; + int[] inner = new int[innerLength]; + array[i] = inner; + for (int j = 0; j < inner.length; j++) { + inner[j] = ThreadLocalRandom.current().nextInt(); + } + } + } + + @Test + public void testIt(){ + long sum1 = Arrays.stream(array) + .parallel() + .flatMapToInt(Arrays::stream) + .asLongStream() + .sum(); + + long sum = StreamSupport.intStream(new RectangleSpliterator(array), true) + .asLongStream() + .sum(); + assertEquals(sum1, sum); + } +} \ No newline at end of file