From 09513fdde844c55d43da580bc79c5fb1da907a36 Mon Sep 17 00:00:00 2001 From: Aleksandra Pankratova Date: Sat, 22 Apr 2017 23:07:03 +0300 Subject: [PATCH 1/3] - part1 is done --- pom.xml | 5 +++ .../part1/exercise/RectangleSpliterator.java | 38 +++++++++++++++---- .../exercise/RectangleSpliteratorTest.java | 28 ++++++++++++++ 3 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 src/main/java/spliterators/part1/exercise/RectangleSpliteratorTest.java diff --git a/pom.xml b/pom.xml index 6616541..016126d 100755 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,11 @@ 4.12 test + + junit + junit + RELEASE + diff --git a/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java b/src/main/java/spliterators/part1/exercise/RectangleSpliterator.java index 678f4f5..17fef59 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,42 @@ private RectangleSpliterator(int[][] array, int startOuterInclusive, int endOute @Override public OfInt trySplit() { - // TODO - throw new UnsupportedOperationException(); + int length = endOuterExclusive - startOuterInclusive; + if (length <= 1) return null; + int middle = startOuterInclusive + length / 2; + RectangleSpliterator rectangleSpliterator = new RectangleSpliterator(array, startOuterInclusive, middle, startInnerInclusive); + startOuterInclusive = middle; + 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 >= array[0].length) return false; + action.accept(array[startOuterInclusive][startInnerInclusive]); + startInnerInclusive++; + if (startInnerInclusive == array[0].length && startOuterInclusive < endOuterExclusive) { + startInnerInclusive = 0; + startOuterInclusive++; + } + 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/main/java/spliterators/part1/exercise/RectangleSpliteratorTest.java b/src/main/java/spliterators/part1/exercise/RectangleSpliteratorTest.java new file mode 100644 index 0000000..8d065b0 --- /dev/null +++ b/src/main/java/spliterators/part1/exercise/RectangleSpliteratorTest.java @@ -0,0 +1,28 @@ +/** + * Created by Aleksandra_Pankratova on 22-Apr-17. + */ +package spliterators.part1.exercise; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.stream.StreamSupport; + +public class RectangleSpliteratorTest { + @Test + public void spliteratorTest() { + int[][] array = {{12, 21, 37, 49, 53}, {61, 72, 81, 99, 100}, {43, 53, 66, 74, 89}}; + long actual = StreamSupport + .intStream(new RectangleSpliterator(array), true) + .asLongStream() + .sum(); + long expected = Arrays + .stream(array) + .parallel() + .flatMapToInt(Arrays::stream) + .asLongStream() + .sum(); + Assert.assertEquals(expected, actual); + } +} \ No newline at end of file From 4231b046132ed91189cef695933408161c61560e Mon Sep 17 00:00:00 2001 From: Aleksandra Pankratova Date: Sat, 22 Apr 2017 23:21:15 +0300 Subject: [PATCH 2/3] - part2 is done --- .../ZipWithIndexDoubleSpliterator.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java index deb4867..eb4ee25 100755 --- a/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java +++ b/src/main/java/spliterators/part2/exercise/ZipWithIndexDoubleSpliterator.java @@ -22,35 +22,39 @@ private ZipWithIndexDoubleSpliterator(int firstIndex, OfDouble inner) { @Override public int characteristics() { - // TODO - throw new UnsupportedOperationException(); + return inner.characteristics(); } @Override public boolean tryAdvance(Consumer action) { - // TODO - throw new UnsupportedOperationException(); + return inner.tryAdvance((Double d) -> { + action.accept(new IndexedDoublePair(currentIndex, d)); + currentIndex++; + }); } @Override public void forEachRemaining(Consumer action) { - // TODO - throw new UnsupportedOperationException(); + inner.forEachRemaining((Double d) -> { + action.accept(new IndexedDoublePair(currentIndex, d)); + currentIndex++; + }); } @Override public Spliterator trySplit() { - // TODO - // if (inner.hasCharacteristics(???)) { - // use inner.trySplit - // } else - + if (inner.hasCharacteristics(Spliterator.SUBSIZED)) { + final OfDouble ofDouble = this.inner.trySplit(); + if (ofDouble == null) return null; + final ZipWithIndexDoubleSpliterator result = new ZipWithIndexDoubleSpliterator(currentIndex, ofDouble); + currentIndex += ofDouble.estimateSize(); + return result; + } return super.trySplit(); } @Override public long estimateSize() { - // TODO - throw new UnsupportedOperationException(); + return inner.estimateSize(); } } From 4540a0b3a768b1e4f3410171f75f02c270c1b4db Mon Sep 17 00:00:00 2001 From: Aleksandra Pankratova Date: Sat, 22 Apr 2017 23:36:55 +0300 Subject: [PATCH 3/3] - part3 is done --- .../exercise/ZipWithArraySpliterator.java | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java index 292137e..a2e7a39 100755 --- a/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java +++ b/src/main/java/spliterators/part3/exercise/ZipWithArraySpliterator.java @@ -9,40 +9,53 @@ public class ZipWithArraySpliterator extends Spliterators.AbstractSplitera private final Spliterator inner; private final B[] array; + private int index; public ZipWithArraySpliterator(Spliterator inner, B[] array) { - super(Long.MAX_VALUE, 0); // FIXME: - // TODO - throw new UnsupportedOperationException(); + super(Math.min(inner.estimateSize(), array.length), inner.characteristics()); + this.inner = inner; + this.array = array; + index = 0; } @Override public int characteristics() { - // TODO - throw new UnsupportedOperationException(); + return inner.characteristics(); } @Override public boolean tryAdvance(Consumer> action) { - // TODO - throw new UnsupportedOperationException(); + return index < array.length && inner.tryAdvance(a -> { + action.accept(new Pair<>(a, array[index])); + index++; + }); } @Override public void forEachRemaining(Consumer> action) { - // TODO - throw new UnsupportedOperationException(); + inner.forEachRemaining(a -> { + action.accept(new Pair<>(a, array[index])); + index++; + }); } @Override public Spliterator> trySplit() { - // TODO - throw new UnsupportedOperationException(); + if (!inner.hasCharacteristics(SUBSIZED)) return super.trySplit(); + Spliterator split = inner.trySplit(); + if (split == null) return null; + final ZipWithArraySpliterator spliterator = new ZipWithArraySpliterator<>(split, array); + spliterator.setIndex(index); + index = Math.min((int) (index + split.estimateSize()), array.length); + return spliterator; } @Override public long estimateSize() { - // TODO - throw new UnsupportedOperationException(); + return Math.min(inner.estimateSize(), array.length - index); } -} + + private void setIndex(int index) { + this.index = index; + } +} \ No newline at end of file