Conversation
build.gradle
Outdated
|
|
||
| apply plugin: 'java' | ||
|
|
||
| sourceCompatibility = 1.5 |
build.gradle
Outdated
| dependencies { | ||
| testCompile group: 'junit', name: 'junit', version: '4.12' | ||
| testCompile group: 'com.google.guava', name: 'guava', version: '19.0' | ||
| //testCompile 'com.google.guava:guava:19.0' |
There was a problem hiding this comment.
эта строка эквивалентна той, что над ней
src/main/java/sp/FirstPartTasks.java
Outdated
| // Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums' | ||
| public static List<String> allTracksSorted(Stream<Album> albums) { | ||
| return albums | ||
| .flatMap((Album album) -> { return album.getTracks().stream(); }) |
There was a problem hiding this comment.
return и скобки не нужны, т.к. всего одно выражение в лямбде
тип для альбома можно не указывать
итого:
.flatMap(album -> album.getTracks().stream())
src/main/java/sp/FirstPartTasks.java
Outdated
| return album.getTracks().stream().anyMatch((Track track) -> | ||
| { return track.getRating() > 95; }); | ||
| } | ||
| }) |
There was a problem hiding this comment.
анонимные классы с одним методов в 8 джаве? как же лямбды? замечание к предыдущему методу здесь тоже актуально
src/main/java/sp/FirstPartTasks.java
Outdated
| { return track.getRating() > 95; }); | ||
| } | ||
| }) | ||
| .sorted((Album a, Album b) -> a.getName().compareTo(b.getName())) |
There was a problem hiding this comment.
.sorted(Comparator.comparing(Album::getName))
| final String[] EXPECTED_ANSWER = { "foo", "foobar" }; | ||
|
|
||
| for (int i = 1; i <= 3; i++) { | ||
| String curFileName = "testFindQuotes" + String.valueOf(i) + ".txt"; |
|
|
||
| for (String file: filesList) { | ||
| Files.delete(Paths.get(file)); | ||
| } |
There was a problem hiding this comment.
если бы было на списках, не пришлось бы с массивов на списки переключаться и обратно
| final double EXPECTED = Math.PI / 4; | ||
| final double EPS = 1e-4; | ||
|
|
||
| Assert.assertEquals("The probability of hit is " + String.valueOf(EXPECTED) + ".", |
There was a problem hiding this comment.
"The probability of hit is " + EXPECTED + "."
| HashMap<String,List<String>> compositions = new HashMap<>(); | ||
| for (int i = 0; i < printers.length; i++) { | ||
| compositions.put(printers[i], Arrays.asList(works[i])); | ||
| } |
There was a problem hiding this comment.
можно заиспользовать класс из google-guava и написать примерно так:
ImmutableMap
.<String, List<String>>builder()
.put("p1", Arrays.asList("a", "b"))
.build();
| "summary amount of all orders.", allProductsAmounts[i], | ||
| result.get(allProductNames[i])); | ||
| } | ||
| } |
There was a problem hiding this comment.
этот тест тоже можно сделать читаемее с помощью предыдущих замечаний
|
Исправил: #5
Но, если можно, хотелось бы узнать поподробнее, в чём проблема с
форматированием?
25.11.2016 20:53, Semyon Proshev пишет:
…
***@***.**** requested changes on this pull request.
надо исправлять
------------------------------------------------------------------------
In build.gradle
<#5 (review)>:
> @@ -0,0 +1,15 @@
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.5
1.8
------------------------------------------------------------------------
In build.gradle
<#5 (review)>:
> @@ -0,0 +1,15 @@
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.5
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ testCompile group: 'junit', name: 'junit', version: '4.12'
+ testCompile group: 'com.google.guava', name: 'guava', version: '19.0'
+ //testCompile 'com.google.guava:guava:19.0'
эта строка эквивалентна той, что над ней
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + .map(Album::getName)
+ .collect(Collectors.toList());
+ }
+
+ // Список названий альбомов, отсортированный лексикографически по названию
+ public static List<String> allNamesSorted(Stream<Album> albums) {
+ return albums
+ .map(Album::getName)
+ .sorted()
+ .collect(Collectors.toList());
+ }
+
+ // Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums'
+ public static List<String> allTracksSorted(Stream<Album> albums) {
+ return albums
+ .flatMap((Album album) -> { return album.getTracks().stream(); })
return и скобки не нужны, т.к. всего одно выражение в лямбде
тип для альбома можно не указывать
итого:
|.flatMap(album -> album.getTracks().stream())|
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + .flatMap((Album album) -> { return album.getTracks().stream(); })
+ .map(Track::getName)
+ .sorted()
+ .collect(Collectors.toList());
+ }
+
+ // Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию
+ public static List<Album> sortedFavorites(Stream<Album> s) {
+ return s
+ .filter(new Predicate<Album>() {
+ @OverRide
+ public boolean test(Album album) {
+ return album.getTracks().stream().anyMatch((Track track) ->
+ { return track.getRating() > 95; });
+ }
+ })
анонимные классы с одним методов в 8 джаве? как же лямбды? замечание к
предыдущему методу здесь тоже актуально
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + .map(Track::getName)
+ .sorted()
+ .collect(Collectors.toList());
+ }
+
+ // Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию
+ public static List<Album> sortedFavorites(Stream<Album> s) {
+ return s
+ .filter(new Predicate<Album>() {
+ @OverRide
+ public boolean test(Album album) {
+ return album.getTracks().stream().anyMatch((Track track) ->
+ { return track.getRating() > 95; });
+ }
+ })
+ .sorted((Album a, Album b) -> a.getName().compareTo(b.getName()))
|.sorted(Comparator.comparing(Album::getName))|
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + return albums.collect(Collectors.groupingBy(Album::getArtist));
+ }
+
+ // Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Artist' использовать его имя)
+ public static Map<Artist, List<String>> groupByArtistMapName(Stream<Album> albums) {
+ return albums
+ .collect(Collectors.groupingBy(
+ Album::getArtist,
+ Collectors.mapping(Album::getName, Collectors.toList())));
+ }
+
+ // Число повторяющихся альбомов в потоке
+ public static long countAlbumDuplicates(Stream<Album> albums) {
+ Map<Album,Long> albumsMap = albums.collect(Collectors.toMap(
+ (album)->album,
+ album->1l,
лучше писать большую L
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + // Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Artist' использовать его имя)
+ public static Map<Artist, List<String>> groupByArtistMapName(Stream<Album> albums) {
+ return albums
+ .collect(Collectors.groupingBy(
+ Album::getArtist,
+ Collectors.mapping(Album::getName, Collectors.toList())));
+ }
+
+ // Число повторяющихся альбомов в потоке
+ public static long countAlbumDuplicates(Stream<Album> albums) {
+ Map<Album,Long> albumsMap = albums.collect(Collectors.toMap(
+ (album)->album,
+ album->1l,
+ (a, b)->a + b));
+ return albumsMap.values().stream().collect(Collectors.summingLong((l)->l))
+ - albumsMap.size();
return albumsMap.values().stream().mapToLong(l -> l).sum() -
albumsMap.size();
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> +
+ // Альбом, в котором максимум рейтинга минимален
+ // (если в альбоме нет ни одного трека, считать, что максимум рейтинга в нем --- 0)
+ public static Optional<Album> minMaxRating(Stream<Album> albums) {
+ return albums.min((Album a, Album b) -> a
+ .getTracks()
+ .stream()
+ .mapToInt(Track::getRating)
+ .max()
+ .orElse(0)
+ - b
+ .getTracks()
+ .stream()
+ .mapToInt(Track::getRating)
+ .max()
+ .orElse(0));
|return albums.min(Comparator.comparingInt(a -> a .getTracks()
.stream() .mapToInt(Track::getRating) .max() .orElse(0))); |
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + public static Map<Artist, List<Album>> groupByArtist(Stream<Album> albums) {
+ return albums.collect(Collectors.groupingBy(Album::getArtist));
+ }
+
+ // Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Artist' использовать его имя)
+ public static Map<Artist, List<String>> groupByArtistMapName(Stream<Album> albums) {
+ return albums
+ .collect(Collectors.groupingBy(
+ Album::getArtist,
+ Collectors.mapping(Album::getName, Collectors.toList())));
+ }
+
+ // Число повторяющихся альбомов в потоке
+ public static long countAlbumDuplicates(Stream<Album> albums) {
+ Map<Album,Long> albumsMap = albums.collect(Collectors.toMap(
+ (album)->album,
Function.identity()
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + .max()
+ .orElse(0));
+ }
+
+ // Список альбомов, отсортированный по убыванию среднего рейтинга его треков (0, если треков нет)
+ public static List<Album> sortByAverageRating(Stream<Album> albums) {
+ return albums
+ .sorted((Album a, Album b) -> -a.
+ getTracks()
+ .stream()
+ .collect(Collectors.averagingInt(Track::getRating)).
+ compareTo(b.
+ getTracks()
+ .stream()
+ .collect(Collectors.averagingInt(Track::getRating))))
+ .collect(Collectors.toList());
|albums.sorted(Comparator.comparingDouble(...).reversed()).collect(toList());
|
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> + return albums
+ .sorted((Album a, Album b) -> -a.
+ getTracks()
+ .stream()
+ .collect(Collectors.averagingInt(Track::getRating)).
+ compareTo(b.
+ getTracks()
+ .stream()
+ .collect(Collectors.averagingInt(Track::getRating))))
+ .collect(Collectors.toList());
+ }
+
+ // Произведение всех чисел потока по модулю 'modulo'
+ // (все числа от 0 до 10000)
+ public static int moduloProduction(IntStream stream, int modulo) {
+ return stream.reduce(1, (int a, int b) -> {return a * b % modulo;});
то же замечание про типы и одно выражение
------------------------------------------------------------------------
In src/main/java/sp/FirstPartTasks.java
<#5 (review)>:
> +
+ // Произведение всех чисел потока по модулю 'modulo'
+ // (все числа от 0 до 10000)
+ public static int moduloProduction(IntStream stream, int modulo) {
+ return stream.reduce(1, (int a, int b) -> {return a * b % modulo;});
+ }
+
+ // Вернуть строку, состояющую из конкатенаций переданного массива, и окруженную строками "<", ">"
+ // см. тесты
+ public static String joinTo(String... strings) {
+ return Arrays.stream(strings).collect(Collectors.joining(", ", "<", ">"));
+ }
+
+ // Вернуть поток из объектов класса 'clazz'
+ public static <R> Stream<R> filterIsInstance(Stream<?> s, Class<R> clazz) {
+ return s.filter((o)->(clazz.isInstance(o))).map((o)->((R)o));
зачем столько скобок?
|filter(clazz::isInstance)|
то же самое можно сделать в map, см метод cast в Class
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> +import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public final class SecondPartTasks {
+
+ private SecondPartTasks() {}
+
+ // Найти строки из переданных файлов, в которых встречается указанная подстрока.
+ public static List<String> findQuotes(List<String> paths, CharSequence sequence) {
+ return paths
+ .stream()
+ .flatMap((filename) -> {
скобки
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> +import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public final class SecondPartTasks {
+
+ private SecondPartTasks() {}
+
+ // Найти строки из переданных файлов, в которых встречается указанная подстрока.
+ public static List<String> findQuotes(List<String> paths, CharSequence sequence) {
+ return paths
+ .stream()
+ .flatMap((filename) -> {
+ try {
+ return Files.lines(Paths.get(filename));
+ } catch (Exception e) {System.out.println(filename);
??? на той же строке?
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> + // Стрелок атакует мишень и каждый раз попадает в произвольную точку квадрата.
+ // Надо промоделировать этот процесс с помощью класса java.util.Random и посчитать, какова вероятность попасть в мишень.
+ public static double piDividedBy4() {
+ //Stream <Point2D.Double>
+ final Point2D.Double CENTER = new Point2D.Double(0.5d, 0.5d);
+ final double RADIUS = 0.5d;
+ final double EPS = 1e-9d;
+ final long NUMBER_OF_SHOTS = 30_000_000;
+
+ Random random = new Random();
+ return Stream
+ .generate(()->new Point2D.Double(random.nextDouble(), random.nextDouble()))
+ .limit(NUMBER_OF_SHOTS)
+ .collect(Collectors.averagingInt(
+ (point) -> (CENTER.distance(point) < RADIUS + EPS)?1:0));
+ //throw new UnsupportedOperationException();
|mapToInt(...).average()|
код везде не отформатирован
-0.5
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> + // Надо вычислить, чья общая длина произведений наибольшая.
+ public static String findPrinter(Map<String, List<String>> compositions) {
+ return compositions
+ .keySet()
+ .stream()
+ .max(
+ (author1, author2)->{
+ return compositions
+ .get(author1)
+ .stream()
+ .collect(Collectors.summingLong(String::length)).compareTo(
+ compositions
+ .get(author2)
+ .stream()
+ .collect(Collectors.summingLong(String::length)));
+ }
Comparator.comparing
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> + public static String findPrinter(Map<String, List<String>> compositions) {
+ return compositions
+ .keySet()
+ .stream()
+ .max(
+ (author1, author2)->{
+ return compositions
+ .get(author1)
+ .stream()
+ .collect(Collectors.summingLong(String::length)).compareTo(
+ compositions
+ .get(author2)
+ .stream()
+ .collect(Collectors.summingLong(String::length)));
+ }
+ ).orElse("");
лучше null, как показатель "отсутствия" результата
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> + return orders
+ .stream()
+ .reduce((Map<String, Integer> allOrders, Map<String, Integer> curOrder)->{
+ curOrder
+ .keySet()
+ .forEach((product)->{
+ Integer amount = allOrders.get(product);
+ if (amount == null) {
+ amount = 0;
+ }
+ amount += curOrder.get(product);
+ allOrders.put(product, amount);
+ });
+ return allOrders;
+ })
+ .orElse(new HashMap<String, Integer>());
Collections.emptyMap()
------------------------------------------------------------------------
In src/main/java/sp/SecondPartTasks.java
<#5 (review)>:
> + public static Map<String, Integer> calculateGlobalOrder(List<Map<String, Integer>> orders) {
+ return orders
+ .stream()
+ .reduce((Map<String, Integer> allOrders, Map<String, Integer> curOrder)->{
+ curOrder
+ .keySet()
+ .forEach((product)->{
+ Integer amount = allOrders.get(product);
+ if (amount == null) {
+ amount = 0;
+ }
+ amount += curOrder.get(product);
+ allOrders.put(product, amount);
+ });
+ return allOrders;
+ })
см на Collectors.groupingBy и Collectors.summingInt
------------------------------------------------------------------------
In src/test/java/sp/SecondPartTasksTest.java
<#5 (review)>:
> +import java.util.*;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.*;
+
+public class SecondPartTasksTest {
+
+ @test
+ public void testFindQuotes() throws IOException {
+ final String[][] FILES_CONTENT = { { "qwerty", "", "foo", "bar", "foobar" },
+ { "bar", "baz" }, {}};
+ final ArrayList<String> filesList = new ArrayList<String>();
+ final String[] EXPECTED_ANSWER = { "foo", "foobar" };
+
+ for (int i = 1; i <= 3; i++) {
+ String curFileName = "testFindQuotes" + String.valueOf(i) + ".txt";
"testFindQuotes" + i + ".txt"
------------------------------------------------------------------------
In src/test/java/sp/SecondPartTasksTest.java
<#5 (review)>:
> + final ArrayList<String> filesList = new ArrayList<String>();
+ final String[] EXPECTED_ANSWER = { "foo", "foobar" };
+
+ for (int i = 1; i <= 3; i++) {
+ String curFileName = "testFindQuotes" + String.valueOf(i) + ".txt";
+ filesList.add(curFileName);
+
+ Files.write(Paths.get(curFileName), Arrays.asList(FILES_CONTENT[i - 1]));
+ }
+
+ Assert.assertArrayEquals("FindQuotes works incorrectly.", EXPECTED_ANSWER,
+ SecondPartTasks.findQuotes(filesList, "foo").toArray());
+
+ for (String file: filesList) {
+ Files.delete(Paths.get(file));
+ }
если бы было на списках, не пришлось бы с массивов на списки
переключаться и обратно
------------------------------------------------------------------------
In src/test/java/sp/SecondPartTasksTest.java
<#5 (review)>:
> + }
+
+ Assert.assertArrayEquals("FindQuotes works incorrectly.", EXPECTED_ANSWER,
+ SecondPartTasks.findQuotes(filesList, "foo").toArray());
+
+ for (String file: filesList) {
+ Files.delete(Paths.get(file));
+ }
+ }
+
+ @test
+ public void testPiDividedBy4() {
+ final double EXPECTED = Math.PI / 4;
+ final double EPS = 1e-4;
+
+ Assert.assertEquals("The probability of hit is " + String.valueOf(EXPECTED) + ".",
"The probability of hit is " + EXPECTED + "."
------------------------------------------------------------------------
In src/test/java/sp/SecondPartTasksTest.java
<#5 (review)>:
> + Assert.assertEquals("The probability of hit is " + String.valueOf(EXPECTED) + ".",
+ EXPECTED, SecondPartTasks.piDividedBy4(), EPS);
+ }
+
+ @test
+ public void testFindPrinter() {
+ final String[] printers = { "p1", "p2", "p3", "p4" };
+ final String[][] works = { {"story", "story"},
+ {"so", "me", "sho", "rt", "sto", "ri", "es"},
+ {"a very-very long story", "and one more"}, {"just tale"} };
+ final String EXPECTED = "p3";
+
+ HashMap<String,List<String>> compositions = new HashMap<>();
+ for (int i = 0; i < printers.length; i++) {
+ compositions.put(printers[i], Arrays.asList(works[i]));
+ }
можно заиспользовать класс из google-guava и написать примерно так:
|ImmutableMap .<String, List<String>>builder() .put("p1",
Arrays.asList("a", "b")) .build(); |
------------------------------------------------------------------------
In src/test/java/sp/SecondPartTasksTest.java
<#5 (review)>:
> + curOrder.put(shopsProductNames[i][j], shopsProductAmounts[i][j]);
+ }
+ orders.add(curOrder);
+ }
+
+ Map<String,Integer> result = SecondPartTasks.calculateGlobalOrder(orders);
+
+ Assert.assertEquals("The resulting map should contain all mentioned products once.",
+ allProductNames.length, result.size());
+
+ for (int i = 0; i < allProductNames.length; i++) {
+ Assert.assertEquals("The global amount of a product odered should match " +
+ "summary amount of all orders.", allProductsAmounts[i],
+ result.get(allProductNames[i]));
+ }
+ }
этот тест тоже можно сделать читаемее с помощью предыдущих замечаний
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#5 (review)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AFrdnxbAiF1qgjmwYM6lytqcZeJRoPUBks5rByCngaJpZM4K2t6J>.
|
| public static Map<String, Integer> calculateGlobalOrder(List<Map<String, Integer>> orders) { | ||
| return orders | ||
| .stream() | ||
| .flatMap(map -> StreamSupport.stream(map.entrySet().spliterator(), false)) |
There was a problem hiding this comment.
.flatMap(map -> map.entrySet().stream())
| "p1", Arrays.asList("story", "story"), | ||
| "p2", Arrays.asList("so", "me", "sho", "rt", "sto", "ri", "es"), | ||
| "p3", Arrays.asList("a very-very long story", "and one more"), | ||
| "p4", Arrays.asList("just tale") |


No description provided.