Как посчитать количество повторений элементов
Короткий ответ
Collections.frequency() считает, сколько раз элемент встречается в коллекции:
void main() {
var votes = List.of("yes", "no", "yes", "yes");
IO.println(Collections.frequency(votes, "yes"));
}Результат:
3Все элементы сразу
groupingBy() с counting() строит таблицу «значение — количество»:
void main() {
var fruits = List.of("apple", "pear", "apple", "plum", "pear", "apple");
Map<String, Long> counts = fruits.stream()
.collect(Collectors.groupingBy(f -> f, TreeMap::new, Collectors.counting()));
IO.println(counts);
}Результат:
{apple=3, pear=2, plum=1}Через merge
Без потоков: merge() кладёт 1 для нового ключа и прибавляет 1 к существующему:
void main() {
var counts = new TreeMap<String, Integer>();
for (String word : "a b a c b a".split(" ")) {
counts.merge(word, 1, Integer::sum);
}
IO.println(counts);
}Результат:
{a=3, b=2, c=1}Самый частый элемент
Найдите пару с максимальным значением:
void main() {
var fruits = List.of("apple", "pear", "apple", "plum", "pear", "apple");
String top = fruits.stream()
.collect(Collectors.groupingBy(f -> f, Collectors.counting()))
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.orElseThrow()
.getKey();
IO.println(top);
}Результат:
appleЧастая ошибка
Вызывать Collections.frequency() для каждого элемента в цикле. Каждый вызов проходит весь список, и на больших данных код становится очень медленным. Для подсчёта всех элементов один раз постройте Map.
Функции из этого ответа
- Collections.frequency() — Считает, сколько раз элемент встречается в коллекции.
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
- Collectors.counting() — Сборщик-счётчик; обычно используется внутри `groupingBy()`.
- Map.merge() — Добавляет значение по ключу или объединяет его с уже существующим.