diff --git a/.gitignore b/.gitignore
index 208a567..58c67b4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,7 @@
.idea/
target/**
+
+build
+.gradle
+classes
diff --git a/pom.xml b/pom.xml
index 4bc64f2..825310e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,7 @@
com.google.guava
guava
- 19.0
+ 21.0
diff --git a/src/main/java/ru/spbau/mit/FirstPartTasks.java b/src/main/java/ru/spbau/mit/FirstPartTasks.java
index 0e71f48..d3ec196 100644
--- a/src/main/java/ru/spbau/mit/FirstPartTasks.java
+++ b/src/main/java/ru/spbau/mit/FirstPartTasks.java
@@ -1,73 +1,119 @@
package ru.spbau.mit;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
+import java.util.function.Function;
+import java.util.function.IntBinaryOperator;
+import java.util.function.ToDoubleFunction;
+import java.util.function.ToIntFunction;
+import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public final class FirstPartTasks {
+// private static Function> albumTracksStreamGetter = ;
private FirstPartTasks() {}
// Список названий альбомов
public static List allNames(Stream albums) {
- throw new UnsupportedOperationException();
+ return albums.map(Album::getName).collect(Collectors.toList());
}
// Список названий альбомов, отсортированный лексикографически по названию
public static List allNamesSorted(Stream albums) {
- throw new UnsupportedOperationException();
+ return albums.map(Album::getName).sorted().collect(Collectors.toList());
}
// Список треков, отсортированный лексикографически по названию, включающий все треки альбомов из 'albums'
public static List allTracksSorted(Stream albums) {
- throw new UnsupportedOperationException();
+ return albums
+ .map(Album::getTracks)
+ .flatMap(Collection::stream)
+ .map(Track::getName)
+ .sorted()
+ .collect(Collectors.toList());
}
// Список альбомов, в которых есть хотя бы один трек с рейтингом более 95, отсортированный по названию
public static List sortedFavorites(Stream s) {
- throw new UnsupportedOperationException();
+ final int threshold = 95;
+ return s.filter(a -> a.getTracks().stream()
+ .anyMatch(track -> track.getRating() > threshold))
+ .sorted(Comparator.comparing(Album::getName))
+ .collect(Collectors.toList());
}
// Сгруппировать альбомы по артистам
public static Map> groupByArtist(Stream albums) {
- throw new UnsupportedOperationException();
+ return albums.collect(Collectors.groupingBy(Album::getArtist));
}
// Сгруппировать альбомы по артистам (в качестве значения вместо объекта 'Album' использовать его имя)
public static Map> groupByArtistMapName(Stream albums) {
- throw new UnsupportedOperationException();
+ return albums.collect(
+ Collectors.groupingBy(
+ Album::getArtist,
+ Collectors.mapping(
+ Album::getName,
+ Collectors.toList()
+ )
+ )
+ );
}
// Число повторяющихся альбомов в потоке
public static long countAlbumDuplicates(Stream albums) {
- throw new UnsupportedOperationException();
+ Map albumsCount = albums.collect(
+ Collectors.groupingBy(
+ Function.identity(),
+ Collectors.counting()
+ ));
+ return albumsCount.entrySet()
+ .stream()
+ .map(e -> e.getValue() - 1)
+ .mapToLong(Long::longValue)
+ .sum();
}
// Альбом в котором максимум рейтинга минимален
// (если в альбоме нет ни одного трека, считать, что максимум рейтинга в нем --- 0)
public static Optional minMaxRating(Stream albums) {
- throw new UnsupportedOperationException();
+ ToIntFunction ratingGetter = a -> a.getTracks()
+ .stream()
+ .mapToInt(Track::getRating)
+ .max()
+ .orElse(0);
+ Comparator albumComparator = Comparator.comparingInt(ratingGetter);
+ return albums.min(albumComparator);
}
// Список альбомов, отсортированный по убыванию среднего рейтинга его треков (0, если треков нет)
public static List sortByAverageRating(Stream albums) {
- throw new UnsupportedOperationException();
+ ToDoubleFunction averageRatingGetter = value -> value.getTracks()
+ .stream()
+ .mapToDouble(Track::getRating)
+ .average()
+ .orElse(0.0);
+ return albums.sorted(Comparator
+ .comparingDouble(averageRatingGetter)
+ .reversed())
+ .collect(Collectors.toList());
}
// Произведение всех чисел потока по модулю 'modulo'
// (все числа от 0 до 10000)
public static int moduloProduction(IntStream stream, int modulo) {
- throw new UnsupportedOperationException();
+ IntBinaryOperator sumModule = (left, right) -> (left * right) % modulo;
+ return stream.reduce(1, sumModule);
}
// Вернуть строку, состояющую из конкатенаций переданного массива, и окруженную строками "<", ">"
// см. тесты
public static String joinTo(String... strings) {
- throw new UnsupportedOperationException();
+ Stream ss = Stream.of(strings);
+ return ss.collect(Collectors.joining(", ", "<", ">"));
}
// Вернуть поток из объектов класса 'clazz'
public static Stream filterIsInstance(Stream> s, Class clazz) {
- throw new UnsupportedOperationException();
+ return s.filter(clazz::isInstance).map(clazz::cast);
}
}
diff --git a/src/main/java/ru/spbau/mit/SecondPartTasks.java b/src/main/java/ru/spbau/mit/SecondPartTasks.java
index 7b0d5a2..7b1e980 100644
--- a/src/main/java/ru/spbau/mit/SecondPartTasks.java
+++ b/src/main/java/ru/spbau/mit/SecondPartTasks.java
@@ -1,15 +1,34 @@
package ru.spbau.mit;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
+import java.util.Random;
+import java.util.function.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
public final class SecondPartTasks {
-
private SecondPartTasks() {}
// Найти строки из переданных файлов, в которых встречается указанная подстрока.
public static List findQuotes(List paths, CharSequence sequence) {
- throw new UnsupportedOperationException();
+ Function> linesGetter = s -> {
+ Path p = Paths.get(s);
+ try {
+ return Files.lines(p);
+ } catch (IOException e) {
+ return Stream.empty();
+ }
+ };
+ return paths.stream()
+ .flatMap(linesGetter)
+ .filter(s -> s.contains(sequence))
+ .collect(Collectors.toList());
}
// В квадрат с длиной стороны 1 вписана мишень.
@@ -17,18 +36,70 @@ public static List findQuotes(List paths, CharSequence sequence)
// Надо промоделировать этот процесс с помощью класса java.util.Random и посчитать,
// какова вероятность попасть в мишень.
public static double piDividedBy4() {
- throw new UnsupportedOperationException();
+ final int pointsLimit = 10000000;
+ final Predicate isHit = p -> p.sqr() <= 1.0;
+ Point seed = new Point();
+
+ UnaryOperator pointGenerator = point -> new Point();
+
+ final double hitNumber = (double) Stream.iterate(seed, pointGenerator)
+ .limit(pointsLimit)
+ .filter(isHit)
+ .count();
+ return hitNumber / pointsLimit;
}
// Дано отображение из имени автора в список с содержанием его произведений.
// Надо вычислить, чья общая длина произведений наибольшая.
public static String findPrinter(Map> compositions) {
- throw new UnsupportedOperationException();
+ Function>, Pair> mapper = stringListEntry -> {
+ String name = stringListEntry.getKey();
+ Integer length = stringListEntry.getValue().stream()
+ .mapToInt(String::length)
+ .sum();
+ return new Pair<>(name, length);
+ };
+
+ Comparator> bestAuthorComparator = Comparator.comparing(o -> o.second);
+
+ return compositions.entrySet()
+ .stream()
+ .map(mapper)
+ .max(bestAuthorComparator)
+ .orElseThrow(UnsupportedOperationException::new).first;
}
// Вы крупный поставщик продуктов. Каждая торговая сеть делает вам заказ в виде Map<Товар, Количество>.
// Необходимо вычислить, какой товар и в каком количестве надо поставить.
public static Map calculateGlobalOrder(List