Какой подход лучше для поиска частоты элемента в arraylist?

Я создал список массивов и ввел несколько элементов в random.I пытался найти частоту появления каждого элемента. Я попытался с двумя подходами и оба отлично работали. Первый метод использует метод прямой прямой, доступный в JAVA, т.е.

  Collection.frequency(collection,"element");

Второй подход заключается в том, что помещение элементов ArrayList в HashMap и поиск частоты

    List<String> elements = new ArrayList<String>();
    elements.add("A");
    elements.add("B");
    elements.add("C");
    elements.add("A");

    Map<String,Integer> count = new HashMap<String,Integer>();

    for(String s : elements)
    {
        if(count.containsKey(s))
        {
            count.put(s,count.get(s)+1);
        }
        else
        {
            count.put(s, 1);
        }
    }

Оба подхода работают отлично. Но я хотел знать, какой из них лучше подходит.

1
08 янв. '15 в 14:35
источник поделиться
4 ответов

Это зависит от того, как часто вам нужно получать информацию о частоте - если это одно из подхода Collections::frequency это хорошо, иначе карта будет более эффективной. Также обратите внимание, что с помощью Java 8 вы можете сохранить несколько строк кода с помощью:

Map<String, Long> count = elements.stream().collect(groupingBy(e -> e, counting()));

принимает следующий импорт:
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

8
08 янв. '15 в 14:41
источник

Ну, если вы будете требовать частоту элементов в своем списке несколько раз, использование Карты будет более эффективным, так как Collections.frequency выполняет итерацию всего списка каждый раз, когда вы его вызываете, в то время как поиск ключа в Map принимает постоянный время.

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

3
08 янв. '15 в 14:37
источник

Ну, ваш вопрос немного расплывчатый, лучший подход, основанный на чем?

Как указывает Эран, если вас беспокоит производительность, и вы будете делать этот звонок много раз, то HashMap сэкономит вам время. Но если нет, то просто использование частоты должно быть намного более ясным и будет загромождать ваш код меньше, поэтому я думаю, что в целом использование первого было бы предпочтительным. В общем, вы хотите использовать методы, которые уже существуют, при их воспроизведении.

0
08 янв. '15 в 14:46
источник

Ваш подход к карте хорош, если вам нужна частота многих или всех ваших элементов, поскольку вы только переименовываете список один раз. Тем не менее, Карта - это всего лишь моментальный снимок частоты списка в то время, когда вы его назвали, обновление было бы более сложным, чем пересчет, если список изменится...

В конце, если вы работаете с небольшими списками, вы не должны заботиться о проблемах с производительностью. Я думаю, что это повлияет только на то, что у вас есть тысячи элементов в списке, или если эта функция вызывается много раз в секунду (какая-то живая услуга).

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

С другой стороны, в вашем вопросе говорится, что вам нужна частота каждого элемента... Итак, в списке вам сначала нужно создать набор, чтобы вы получили уникальные элементы, а затем примените метод Collections.frequency(). Принимая это во внимание, я бы действительно использовал подход Map, или в Java8 гораздо более крутой поток...

0
08 янв. '15 в 14:46
источник

Посмотрите другие вопросы по меткам или Задайте вопрос