From 62f3d96c915d72171808ed4ea675ead657fdf4a3 Mon Sep 17 00:00:00 2001 From: Elena_Fedorovskaia Date: Tue, 11 Jul 2017 17:09:35 +0300 Subject: [PATCH 1/5] Added getCoolestByPosition --- src/test/java/part2/exercise/CollectorsExercise1.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/java/part2/exercise/CollectorsExercise1.java b/src/test/java/part2/exercise/CollectorsExercise1.java index 46b6765..e64b46b 100755 --- a/src/test/java/part2/exercise/CollectorsExercise1.java +++ b/src/test/java/part2/exercise/CollectorsExercise1.java @@ -16,7 +16,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.*; public class CollectorsExercise1 { @@ -61,8 +61,12 @@ private Map getCoolestByPosition(List employees) { // Second option // Collectors.toMap // iterate twice: stream...collect(...).stream()... - // TODO - throw new UnsupportedOperationException(); + return employees.stream() + .flatMap(e -> e.getJobHistory().stream() + .map(j -> new PersonPositionDuration(e.getPerson(), j.getPosition(), j.getDuration()))) + .collect(groupingBy(PersonPositionDuration::getPosition, + collectingAndThen(maxBy(Comparator.comparing(PersonPositionDuration::getDuration)), + p -> p.get().getPerson()))); } @Test From d23eadaed8b231aa54584f85c1dd05328d3c9f89 Mon Sep 17 00:00:00 2001 From: Elena_Fedorovskaia Date: Thu, 13 Jul 2017 16:34:34 +0300 Subject: [PATCH 2/5] CollectorsExercise1 is done --- .../part2/exercise/CollectorsExercise1.java | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/src/test/java/part2/exercise/CollectorsExercise1.java b/src/test/java/part2/exercise/CollectorsExercise1.java index e64b46b..e09d987 100755 --- a/src/test/java/part2/exercise/CollectorsExercise1.java +++ b/src/test/java/part2/exercise/CollectorsExercise1.java @@ -61,9 +61,7 @@ private Map getCoolestByPosition(List employees) { // Second option // Collectors.toMap // iterate twice: stream...collect(...).stream()... - return employees.stream() - .flatMap(e -> e.getJobHistory().stream() - .map(j -> new PersonPositionDuration(e.getPerson(), j.getPosition(), j.getDuration()))) + return getPersonPositionDurationStream(employees) .collect(groupingBy(PersonPositionDuration::getPosition, collectingAndThen(maxBy(Comparator.comparing(PersonPositionDuration::getDuration)), p -> p.get().getPerson()))); @@ -76,11 +74,59 @@ public void getTheCoolestOne2() { coolestByPosition.forEach((position, person) -> System.out.println(position + " -> " + person)); } + private Stream getPersonPositionDurationStream(List employees) { + return employees.stream().flatMap(e -> e.getJobHistory().stream() + .map(j -> new PersonPositionDuration(e.getPerson(), j.getPosition(), j.getDuration()))); + } + // With the longest sum duration on this position // { John Doe, [{dev, google, 4}, {dev, epam, 4}] } предпочтительнее, чем { A B, [{dev, google, 6}, {QA, epam, 100}]} private Map getCoolestByPosition2(List employees) { - // TODO - throw new UnsupportedOperationException(); + + return getPersonPositionDurationStream(employees).collect( + new Collector, Map>() { + @Override + public Supplier> supplier() { + return HashMap::new; + } + + @Override + public BiConsumer, PersonPositionDuration> accumulator() { + return (map, ppd) -> { + map.putIfAbsent(ppd.getPosition(), ppd); + PersonPositionDuration currentPpd = map.get(ppd.getPosition()); + if (ppd.getDuration() > currentPpd.getDuration()) { + map.put(ppd.getPosition(), ppd); + } + }; + } + + @Override + public BinaryOperator> combiner() { + return (m1, m2) -> { + m2.forEach((k, v) -> m1.merge(k, v, (v1, v2) -> v1.getDuration() > v2.getDuration() ? v1 : v2)); + return m1; + }; + } + + @Override + public Function, Map> finisher() { + return map -> map.entrySet() + .stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + item -> item.getValue().getPerson() + ) + ); + } + + @Override + public Set characteristics() { + return Collections.unmodifiableSet(EnumSet.of(Characteristics.UNORDERED)); + } + } + ); } private List getEmployees() { From 43eaecc9e6e8d4cb3d506903dbcb3cb7e76437c7 Mon Sep 17 00:00:00 2001 From: Elena_Fedorovskaia Date: Thu, 13 Jul 2017 16:57:41 +0300 Subject: [PATCH 3/5] CollectorsExercise2 is done --- .../part2/exercise/CollectorsExercise2.java | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/test/java/part2/exercise/CollectorsExercise2.java b/src/test/java/part2/exercise/CollectorsExercise2.java index 00fda00..3c86760 100755 --- a/src/test/java/part2/exercise/CollectorsExercise2.java +++ b/src/test/java/part2/exercise/CollectorsExercise2.java @@ -176,24 +176,61 @@ public void collectKeyValueMap() { // final Map> keyValuesMap1 = valueMap1.entrySet().stream()... // В 1 проход в 2 Map с использованием MapPair и mapMerger + + Map keyMap1 = pairs.stream() + .collect( + Collectors.toMap( + p -> p.getKey().getId(), + Pair::getKey, + (v1, v2) -> v1 + ) + ); + + Map> valuesMap1 = pairs.stream() + .collect( + Collectors.groupingBy( + p -> p.getValue().getKeyId(), + Collectors.mapping(Pair::getValue, toList()) + ) + ); + + Map> keyValuesMap1 = valuesMap1.entrySet().stream() + .collect( + Collectors.toMap( + p -> keyMap1.get(p.getKey()), + Map.Entry::getValue + ) + ); final MapPair res2 = pairs.stream() .collect(new Collector() { @Override public Supplier supplier() { - // TODO - throw new UnsupportedOperationException(); + return MapPair::new; } @Override public BiConsumer accumulator() { - // TODO add key and value to maps - throw new UnsupportedOperationException(); + return (mp, p) -> { + mp.getKeyById().computeIfAbsent(p.getKey().getId(), q -> p.getKey()); + mp.getValueById().computeIfAbsent(p.getValue().getKeyId(), q -> new ArrayList<>()) + .add(p.getValue()); + + }; } @Override public BinaryOperator combiner() { - // TODO use mapMerger - throw new UnsupportedOperationException(); + return (mp1,mp2) -> { + BinaryOperator> binaryOperator = mapMerger((v1,v2) -> v1); + Map map = binaryOperator.apply(mp1.getKeyById(), mp2.getKeyById()); + BinaryOperator>> mapBinaryOperator = mapMerger((v1,v2) -> { + v1.addAll(v2); + return v1; + }); + Map> listMap = mapBinaryOperator.apply(mp1.getValueById(), + mp2.getValueById()); + return new MapPair(map, listMap); + }; } @Override From ac8cdbce3e8ce67d54793ac9b588511c9a90e948 Mon Sep 17 00:00:00 2001 From: Elena_Fedorovskaia Date: Thu, 13 Jul 2017 17:08:04 +0300 Subject: [PATCH 4/5] CollectorsExercise2 is done --- .../part2/exercise/CollectorsExercise2.java | 55 +++++-------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/src/test/java/part2/exercise/CollectorsExercise2.java b/src/test/java/part2/exercise/CollectorsExercise2.java index 3c86760..3275e11 100755 --- a/src/test/java/part2/exercise/CollectorsExercise2.java +++ b/src/test/java/part2/exercise/CollectorsExercise2.java @@ -17,6 +17,9 @@ import java.util.stream.Stream; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; public class CollectorsExercise2 { @@ -179,7 +182,7 @@ public void collectKeyValueMap() { Map keyMap1 = pairs.stream() .collect( - Collectors.toMap( + toMap( p -> p.getKey().getId(), Pair::getKey, (v1, v2) -> v1 @@ -196,11 +199,12 @@ public void collectKeyValueMap() { Map> keyValuesMap1 = valuesMap1.entrySet().stream() .collect( - Collectors.toMap( + toMap( p -> keyMap1.get(p.getKey()), Map.Entry::getValue ) ); + final MapPair res2 = pairs.stream() .collect(new Collector() { @Override @@ -220,10 +224,10 @@ public BiConsumer accumulator() { @Override public BinaryOperator combiner() { - return (mp1,mp2) -> { - BinaryOperator> binaryOperator = mapMerger((v1,v2) -> v1); - Map map = binaryOperator.apply(mp1.getKeyById(), mp2.getKeyById()); - BinaryOperator>> mapBinaryOperator = mapMerger((v1,v2) -> { + return (mp1, mp2) -> { + BinaryOperator> binaryOperator = mapMerger((v1, v2) -> v1); + Map map = binaryOperator.apply(mp1.getKeyById(), mp2.getKeyById()); + BinaryOperator>> mapBinaryOperator = mapMerger((v1, v2) -> { v1.addAll(v2); return v1; }); @@ -251,44 +255,11 @@ public Set characteristics() { // final Map> keyValuesMap2 = valueMap2.entrySet().stream()... - // Получение результата сразу: - - final SubResult res3 = pairs.stream() - .collect(new Collector() { - @Override - public Supplier supplier() { - // TODO - throw new UnsupportedOperationException(); - } - - @Override - public BiConsumer accumulator() { - // TODO add key to map, then check value.keyId and add it to one of maps - throw new UnsupportedOperationException(); - } - - @Override - public BinaryOperator combiner() { - // TODO use mapMerger, then check all valuesWithoutKeys - throw new UnsupportedOperationException(); - } - - @Override - public Function finisher() { - // TODO use mapMerger, then check all valuesWithoutKeys - throw new UnsupportedOperationException(); - } - - @Override - public Set characteristics() { - return Collections.unmodifiableSet(EnumSet.of( - Characteristics.UNORDERED)); - } - }); - - final Map> keyValuesMap3 = res3.getSubResult(); + final Map> keyValuesMap2 = valuesMap2.entrySet().stream().collect(toMap(e -> keyMap2.get(e.getKey()), Map.Entry::getValue)); // compare results + assertThat(keyMap1, equalTo(keyMap2)); + assertThat(keyValuesMap1.keySet(), equalTo(keyValuesMap2.keySet())); } } From f838408a9f997b3ada6bdde99d1efb396b295db4 Mon Sep 17 00:00:00 2001 From: Elena_Fedorovskaia Date: Mon, 17 Jul 2017 16:11:02 +0300 Subject: [PATCH 5/5] CollectorsExercise2 is done --- src/test/java/part2/exercise/CollectorsExercise2.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/java/part2/exercise/CollectorsExercise2.java b/src/test/java/part2/exercise/CollectorsExercise2.java index 3275e11..0347ff8 100755 --- a/src/test/java/part2/exercise/CollectorsExercise2.java +++ b/src/test/java/part2/exercise/CollectorsExercise2.java @@ -204,7 +204,6 @@ public void collectKeyValueMap() { Map.Entry::getValue ) ); - final MapPair res2 = pairs.stream() .collect(new Collector() { @Override @@ -224,10 +223,10 @@ public BiConsumer accumulator() { @Override public BinaryOperator combiner() { - return (mp1, mp2) -> { - BinaryOperator> binaryOperator = mapMerger((v1, v2) -> v1); - Map map = binaryOperator.apply(mp1.getKeyById(), mp2.getKeyById()); - BinaryOperator>> mapBinaryOperator = mapMerger((v1, v2) -> { + return (mp1,mp2) -> { + BinaryOperator> binaryOperator = mapMerger((v1,v2) -> v1); + Map map = binaryOperator.apply(mp1.getKeyById(), mp2.getKeyById()); + BinaryOperator>> mapBinaryOperator = mapMerger((v1,v2) -> { v1.addAll(v2); return v1; });