Подсчет количества повторений элементов в ArrayList Java

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подсчёта количества появлений элемента в List можно использовать Collections.frequency(List list, Object element). Этот метод прост и эффективен:

Java
Скопировать код
int occurrences = Collections.frequency(myList, "apple"); // Узнаём количество "яблок"

Код выше будет вычислять частоту появления элемента "apple" в списке myList.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Применяем HashMap

Если вам не подходит метод Collections.frequency или хотите отслеживать процесс подсчёта самостоятельно, вы можете использовать HashMap. Для этого выполним следующие шаги:

Java
Скопировать код
HashMap<String, Integer> frequencyMap = new HashMap<>();
for(String item : myList) {
    frequencyMap.put(item, frequencyMap.getOrDefault(item, 0) + 1);
}
int occurrences = frequencyMap.getOrDefault("apple", 0);

Такой подход дает вам больше гибкости и позволяет наблюдать за весь процессом подсчёта.

Использование потоков Java 8

В Java 8 было введено функциональное программирование, упростившее обработку коллекций. Воспользуемся потоками для подсчёта вхождений:

Java
Скопировать код
long occurrences = myList.stream()
                         .filter("apple"::equals)
                         .count(); // Считаем количество "яблок"

Данный способ особенно полезен, когда вам нужно интегрировать потоки в вашу текущую работу.

Визуализация

Возьмём List в качестве аналога полки в магазине, а элемент для подсчёта представим в виде определённой марки сухих завтраков:

Markdown
Скопировать код
🛒 Полка в магазине: [🥣🥣🍜🍜🥣🥣🥣🍜🥣]

Наша задача подсчитать количество ваших любимых 🥣.

Java
Скопировать код
Collections.frequency(groceryShelf, "🥣");

Результат:

Markdown
Скопировать код
🥣 Количество: 5

Метод Collections.frequency в данном случае аналогичен работе продавца, который считает товары за вас.

Специализированный список с встроенным подсчётом

Если вам требуется отслеживать частоту элементов в списке, создайте специализированный класс наследник:

Java
Скопировать код
public class FrequencyList<E> extends ArrayList<E> {
    private final HashMap<E, Integer> frequencyMap = new HashMap<>();

    @Override
    public boolean add(E e) {
        frequencyMap.put(e, frequencyMap.getOrDefault(e, 0) + 1);
        return super.add(e);
    }

    public int getFrequency(E e) {
        return frequencyMap.getOrDefault(e, 0);
    }
}

Этот класс содержит всю необходимую логику подсчёта и обеспечивает удобный интерфейс работы.

Учёт краевых случаев

Работая с нестандартными объектами, может возникнуть сложность в подсчёте их количества. Адекватное переопределение методов equals() и hashCode() обезопасит вас от ошибок при работе с коллекциями или потоками.

Если ваш List используется различными потоками, воспользуйтесь ConcurrentHashMap или синхронизируйте блоки кода, чтобы избежать проблем с многопоточностью.

Подсчёт без изменений в классе

В ситуациях, когда исходный класс изменять нельзя, лямбда-выражения и интерфейсы Java помогут применить предикаты:

Java
Скопировать код
long occurrences = myList.stream()
                         .filter(item -> item.meetsCondition())
                         .count();

Полиморфный подсчет

Для работы с элементами разного типа в List, воспользуйтесь полиморфизмом:

Java
Скопировать код
HashMap<Class<?>, Integer> typeFrequency = new HashMap<>();
for(Object item : myList){
    typeFrequency.put(item.getClass(), typeFrequency.getOrDefault(item.getClass(), 0) + 1);
}

Адаптация под Java 8 и последующие улучшения

С появлением Java 8 и потоков классические методы итерации по коллекциям всё ещё актуальны, но рефакторинг, например, с применением потоков, может значительно упростить код и обновить его под новые требования и задачи.

Полезные материалы

  1. Обзор коллекций в Java — официальная документация по коллекциям Java.
  2. Как посчитать количество вхождений элемента в список – Stack Overflow — обсуждение методов подсчета на Stack Overflow с примерами использования Java 8 streams.
  3. Учебник по Java 8 STREAMS – YouTube — видеоурок, посвящённый работе с потоками в Java.
  4. HashMap в Java – GeeksforGeeks — статья о использовании HashMap для подсчета элементов.
  5. Учебник | DigitalOcean — руководство по подсчёту вхождений в Java-коллекциях.
  6. DZone — информация о подсчете элементов списка с помощью потоков Java 8.