From 1dcc85dce13d32397ab8f74981ab37c53f1bdcf9 Mon Sep 17 00:00:00 2001 From: MortyMerr Date: Mon, 17 Jul 2017 13:20:14 +0300 Subject: [PATCH 1/3] part1 --- .../part1/exercise/RectangleSpliterator.java | 58 ++++++++++++++----- .../exercise/RectangleSpliteratorTest.java | 58 +++++++++++++++++++ 2 files changed, 103 insertions(+), 13 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..b284928 100755 --- a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java +++ b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java @@ -6,41 +6,73 @@ import java.util.function.IntConsumer; public class RectangleSpliterator extends Spliterators.AbstractIntSpliterator { - private final int innerLength; private final int[][] array; - private final int startOuterInclusive; - private final int endOuterExclusive; - private final int startInnerInclusive; + private int startOuterInclusive; + private int endOuterExclusive; + private int startInnerInclusive; + private int endInnerExclusive; public RectangleSpliterator(int[][] array) { - this(array, 0, array.length, 0); + this(array, 0, array.length, 0, array.length == 0 ? 0 : array[0].length); } - private RectangleSpliterator(int[][] array, int startOuterInclusive, int endOuterExclusive, int startInnerInclusive) { + private RectangleSpliterator(final int[][] array, + final int startOuterInclusive, + final int endOuterExclusive, + final int startInnerInclusive, + final int endInnerExclusive) { super(Long.MAX_VALUE, Spliterator.IMMUTABLE | Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.NONNULL); - innerLength = array.length == 0 ? 0 : array[0].length; + this.endInnerExclusive = endInnerExclusive; this.array = array; this.startOuterInclusive = startOuterInclusive; this.endOuterExclusive = endOuterExclusive; this.startInnerInclusive = startInnerInclusive; + innerLength = array.length == 0 ? 0 : array[0].length; } @Override public OfInt trySplit() { - // TODO - throw new UnsupportedOperationException(); + final int length = endOuterExclusive - startOuterInclusive; + if (length < 2) { + final int inLength = endInnerExclusive - startInnerInclusive; + if (inLength < 5) { + return null; + } else { + final int mid = startInnerInclusive + inLength / 2; + final RectangleSpliterator res = + new RectangleSpliterator(array, startOuterInclusive, endOuterExclusive, mid, endInnerExclusive); + endInnerExclusive = mid; + return res; + } + } + + final int mid = startOuterInclusive + length / 2; + final RectangleSpliterator res = + new RectangleSpliterator(array, mid, endOuterExclusive, startInnerInclusive, endInnerExclusive); + endOuterExclusive = mid; + 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(); + public boolean tryAdvance(final IntConsumer action) { + if (startOuterInclusive >= endOuterExclusive) { + return false; + } + + final int value = array[startOuterInclusive][startInnerInclusive]; + startInnerInclusive += 1; + if (startInnerInclusive == endInnerExclusive) { + startOuterInclusive++; + startInnerInclusive = 0; + } + action.accept(value); + return true; } } 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..85014cd --- /dev/null +++ b/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java @@ -0,0 +1,58 @@ +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() { + final int outerLength = 5; + array = new int[outerLength][]; + + for (int i = 0; i < array.length; i++) { + final int innerLength = 10; + final int[] inner = new int[innerLength]; + array[i] = inner; + for (int j = 0; j < inner.length; j++) { + inner[j] = ThreadLocalRandom.current().nextInt();; + } + } + } + + @Test + public void test_seq() { + final long expected = Arrays.stream(array) + .sequential() + .flatMapToInt(Arrays::stream) + .asLongStream() + .sum(); + final long res = StreamSupport.intStream(new RectangleSpliterator(array), false) + .asLongStream() + .sum(); + + assertEquals(expected, res); + } + + @Test + public void test_par() { + final long expected = Arrays.stream(array) + .parallel() + .flatMapToInt(Arrays::stream) + .asLongStream() + .sum(); + final long res = StreamSupport.intStream(new RectangleSpliterator(array), true) + .asLongStream() + .sum(); + + assertEquals(expected, res); + } +} \ No newline at end of file From cdfbe7b51f38776042fab8d12c1b4824fa098208 Mon Sep 17 00:00:00 2001 From: MortyMerr Date: Mon, 17 Jul 2017 16:11:13 +0300 Subject: [PATCH 2/3] fixes --- .../part1/exercise/RectangleSpliterator.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java index b284928..c481001 100755 --- a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java +++ b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java @@ -3,6 +3,7 @@ import java.util.Spliterator; import java.util.Spliterators; +import java.util.function.Consumer; import java.util.function.IntConsumer; public class RectangleSpliterator extends Spliterators.AbstractIntSpliterator { @@ -75,4 +76,13 @@ public boolean tryAdvance(final IntConsumer action) { action.accept(value); return true; } + + @Override + public void forEachRemaining(final Consumer action) { + for (int i = startOuterInclusive; i < endOuterExclusive; i++) { + for (int j = startInnerInclusive; j < endInnerExclusive; j++) { + action.accept(array[i][j]); + } + } + } } From 0761fc95d3ec4685497a8b52255e0d2fadcc2979 Mon Sep 17 00:00:00 2001 From: MortyMerr Date: Mon, 17 Jul 2017 17:49:51 +0300 Subject: [PATCH 3/3] fixes --- .../spliterators/part1/exercise/RectangleSpliterator.java | 8 ++++---- .../part1/exercise/RectangleSpliteratorTest.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java index c481001..144a63b 100755 --- a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java +++ b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java @@ -43,16 +43,16 @@ public OfInt trySplit() { } else { final int mid = startInnerInclusive + inLength / 2; final RectangleSpliterator res = - new RectangleSpliterator(array, startOuterInclusive, endOuterExclusive, mid, endInnerExclusive); - endInnerExclusive = mid; + new RectangleSpliterator(array, startOuterInclusive, endOuterExclusive, startInnerInclusive, mid); + startInnerInclusive = mid; return res; } } final int mid = startOuterInclusive + length / 2; final RectangleSpliterator res = - new RectangleSpliterator(array, mid, endOuterExclusive, startInnerInclusive, endInnerExclusive); - endOuterExclusive = mid; + new RectangleSpliterator(array, startOuterInclusive, mid, startInnerInclusive, endInnerExclusive); + startOuterInclusive = mid; return res; } diff --git a/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java b/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java index 85014cd..e29f7c0 100644 --- a/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java +++ b/src/test/java/spliterators/part1/exercise/RectangleSpliteratorTest.java @@ -15,11 +15,11 @@ public class RectangleSpliteratorTest { @Before public void setup() { - final int outerLength = 5; + final int outerLength = 100; array = new int[outerLength][]; for (int i = 0; i < array.length; i++) { - final int innerLength = 10; + final int innerLength = 100; final int[] inner = new int[innerLength]; array[i] = inner; for (int j = 0; j < inner.length; j++) {