Частотная карта
Значение как ключ, количество как данные
Частотная карта хранит для каждого значения количество его появлений. Само значение становится ключом, а счётчик — значением в Map. Этот приём подходит для чисел, символов, строк и любых других объектов, которые можно использовать как ключи.
Map<Integer, Integer> frequency = new HashMap<>();
for (int value : numbers) {
int count = frequency.getOrDefault(value, 0);
frequency.put(value, count + 1);
}
При первом появлении ключа getOrDefault() возвращает 0.
При следующих появлениях из карты берётся уже накопленный счётчик и увеличивается на единицу.
После одного прохода карта содержит частоту каждого различного значения.
Сколько это стоит
Если в массиве n элементов, цикл делает n итераций.
При ожидаемой стоимости операций HashMap O(1) построение карты занимает O(n) времени.
Если различных значений k, дополнительная память составляет O(k).
Это особенно полезно, когда после подсчёта нужно быстро отвечать на вопросы вроде «сколько раз встречается 7?», «какие значения появились больше одного раза?» или «одинаковы ли наборы частот у двух последовательностей?».
Компактная запись через merge
Тот же счётчик можно обновлять методом merge().
Он добавит начальное значение 1, если ключа ещё нет,
а для существующего ключа объединит старое и новое значения переданной функцией.
for (int value : numbers) {
frequency.merge(value, 1, Integer::sum);
}
Обе записи решают одну и ту же задачу. В алгоритмах важнее сама модель «элемент → количество»: как именно обновлять счётчик — вопрос читаемости и привычного стиля кода.