78. Алгоритм подсчёта вхождений элементов списка #
🔥 Нужно реализовать метод, который принимает список Integer
и возвращает структуру с уникальными элементами и количеством их вхождений.
public class Utils {
// на вход список целых чисел, необходимо получить структуру: уникальные элементы и их кол-во
// пример: 1 2 11 2 11 9 11 1 2 3
//
// структура:
// 1 -> 2
// 2 -> 3
// 11 -> 3
// 9 -> 1
public Map<Integer, Integer> countElementItems(List<Integer> list) {
// код тут
}
}
Спойлеры к решению
Подсказки
💡 Для подсчёта удобно использовать
💡 Можно воспользоваться
💡 В Java 8+ можно применять
💡 Если список пустой — вернуть пустую структуру.
Map<Integer, Integer>
.💡 Можно воспользоваться
HashMap
для скорости, либо TreeMap
для сортировки ключей.💡 В Java 8+ можно применять
Collectors.groupingBy(...)
.💡 Если список пустой — вернуть пустую структуру.
Решение
Реализация через цикл:
public Map<Integer, Integer> countElementItems(List<Integer> list) {
Map<Integer, Integer> result = new HashMap<>();
for (Integer value : list) {
result.put(value, result.getOrDefault(value, 0) + 1);
}
return result;
}
Реализация через Stream API:
public Map<Integer, Long> countElementItems(List<Integer> list) {
return list.stream()
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()
));
}
В первом варианте
Map<Integer, Integer>
.Во втором —
Map<Integer, Long>
(так какcounting()
возвращаетLong
).
📌 Итог:
Уникальные значения — ключи карты.
Количество вхождений — значения карты.
Решение работает за O(n) по времени и O(n) по памяти.