4. Отфильтровать и отсортировать фамилии
Условие задачи:
Дан список строк, содержащих полные ФИО в формате «фамилия имя отчество».
Необходимо с помощью Stream API:
получить фамилию из каждой строки;
оставить только фамилии длиной больше 3 символов;
отсортировать фамилии в алфавитном порядке;
собрать результат в список.
Код:
public class Main {
public static void main(String[] args) {
var fios = List.of(
"Петров Петр Петрович",
"Иванов Иван Иванович",
"Алексеев Алексей Алексеевич",
"Васильев Василий Васильевич",
"Сидоров Сидор Сидорович",
"Николаев Николай Николаевич",
"Андреев Андрей Андреевич"
);
}
}
Спойлеры к решению
Подсказки
💡 Через
💡 Фамилия — первая часть строки.
💡 Через
💡
💡
map() преобразуй каждое ФИО в фамилию.💡 Фамилия — первая часть строки.
💡 Через
filter() оставь фамилии длиной больше 3 символов.💡
sorted() выполняет сортировку строк в естественном порядке.💡
toList() собирает результат в список.Решение
List<String> result = fios.stream()
.map(fio -> fio.split("\\s+")[0])
.filter(surname -> surname.length() > 3)
.sorted()
.toList();
Сначала:
.map(fio -> fio.split("\\s+")[0])
разбивает ФИО по пробельным символам и берёт первую часть — фамилию.
Затем:
.filter(surname -> surname.length() > 3)
оставляет только фамилии длиной больше трёх символов.
После этого:
.sorted()
сортирует фамилии в естественном порядке строк.
Для приведённых данных результат будет:
[Алексеев, Андреев, Васильев, Иванов, Николаев, Петров, Сидоров]
Если используется Java до версии 16, вместо toList() можно использовать:
.collect(Collectors.toList());
Временная сложность определяется сортировкой — O(n log n), дополнительная память — O(n).