12. Отфильтровать и сгруппировать имена по длине
Условие задачи:
Дан список имён пользователей.
Необходимо с помощью Stream API:
оставить только имена, начинающиеся с буквы
А;сгруппировать их по длине;
вернуть результат в виде
Map<Integer, List<String>>, где:ключ — длина имени;
значение — список имён такой длины.
Код:
public class Main {
public static void main(String[] args) {
List<String> names = List.of(
"Анна",
"Александр",
"Андрей",
"Антон",
"Борис",
"Богдан",
"Мария",
"Максим",
"Артём"
);
System.out.println(processNames(names));
}
public static Map<Integer, List<String>> processNames(List<String> names) {
return null;
}
}
Ожидаемый результат:
{4=[Анна], 5=[Антон, Артём], 6=[Андрей], 9=[Александр]}
Спойлеры к решению
Подсказки
💡 Создай поток через
💡 Через
💡 Для группировки используй
💡 Ключом группы будет длина строки —
stream().💡 Через
filter() оставь только строки, начинающиеся с "А".💡 Для группировки используй
Collectors.groupingBy().💡 Ключом группы будет длина строки —
String::length.Решение
public static Map<Integer, List<String>> processNames(List<String> names) {
return names.stream()
.filter(name -> name.startsWith("А"))
.collect(Collectors.groupingBy(String::length));
}
Сначала:
.filter(name -> name.startsWith("А"))
оставляет только имена, начинающиеся с буквы А.
Затем:
.collect(Collectors.groupingBy(String::length))
группирует имена по их длине.
Для исходных данных группы будут такими:
4 -> [Анна]
5 -> [Антон, Артём]
6 -> [Андрей]
9 -> [Александр]
Тип результата:
Map<Integer, List<String>>
Временная сложность — O(n), дополнительная память — O(n) для результата.