Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как посчитать количество повторений элементов

Короткий ответ

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() — Добавляет значение по ключу или объединяет его с уже существующим.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.