У меня ArrayList
есть класс коллекции Java, следующим образом:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Как видите, animals
ArrayList
состоит из 3 bat
элементов и одного owl
элемента. Мне было интересно, есть ли какой-либо API в структуре Collection, который возвращает количество bat
вхождений или есть другой способ определить количество вхождений.
Я обнаружил, что в Google Collection Multiset
есть API, который возвращает общее количество вхождений элемента. Но это совместимо только с JDK 1.5. Наш продукт в настоящее время находится в JDK 1.6, поэтому я не могу его использовать.
Ответы:
Я уверен, что статический частотный метод в Коллекциях пригодится здесь:
Вот как бы я это сделал в любом случае. Я уверен, что это JDK 1.6.
источник
В Java 8:
источник
Collections.frequency()
? Это кажется менее читабельным.Это показывает, почему важно « обращаться к объектам по их интерфейсам », как описано в книге « Эффективное Java» .
Если вы кодируете реализацию и используете ArrayList, скажем, в 50 местах в вашем коде, когда вы найдете хорошую реализацию «List», которая подсчитывает элементы, вам придется изменить все эти 50 мест, и, вероятно, вам придется нарушить ваш код (если он используется только вами, это не имеет большого значения, но если он используется кем-то другим, вы также нарушите их код)
Программируя интерфейс, вы можете оставить эти 50 мест без изменений и заменить реализацию из ArrayList на «CountItemsList» (например) или какой-либо другой класс.
Ниже приведен очень простой пример того, как это можно написать. Это всего лишь образец, готовый к производству Список будет намного сложнее.
Применяемые здесь ОО-принципы: наследование, полиморфизм, абстракция, инкапсуляция.
источник
К сожалению, нет простого вызова метода, который может это сделать. Все, что вам нужно сделать, это создать карту и рассчитывать частоту с ней.
источник
В Java нет нативного метода сделать это за вас. Однако вы можете использовать IterableUtils # countMatches () из Apache Commons-Collections, чтобы сделать это за вас.
источник
На самом деле, класс Collections имеет статический метод с именем : quency (Collection c, Object o), который возвращает количество вхождений искомого элемента, кстати, для вас это будет отлично работать:
источник
Альтернативное решение Java 8 с использованием Streams :
источник
Интересно, почему вы не можете использовать этот API Google Collection с JDK 1.6. Так ли это? Я думаю, что вы можете, не должно быть никаких проблем с совместимостью, так как он создан для более низкой версии. Случай был бы другим, если бы он был построен для 1.6, а вы используете 1.5.
Я где то не прав?
источник
Немного более эффективный подход может быть
источник
Чтобы получить вхождения объекта из списка напрямую:
Чтобы получить вхождение коллекции Object в списке, переопределите метод equals в классе Object следующим образом:
Вызовите Collections.frequency как:
источник
Простой способ найти вхождение строкового значения в массив с использованием функций Java 8.
Вывод: {Кошка = 2, Коза = 1, Корова = 1, Корова = 1, Собака = 1}
Вы можете заметить, что «Корова» и «корова» не считаются одной и той же строкой, и если вам требуется ее при одном и том же значении, используйте .toLowerCase (). Пожалуйста, найдите фрагмент ниже для того же.
Вывод: {кошка = 2, корова = 2, коза = 1, собака = 1}
источник
toString()
не нужен. Вы можете просто сделать:duplicateList.stream().collect(Collectors.groupingBy(e -> e,Collectors.counting()));
То, что вы хотите, - это сумка, которая похожа на набор, но при этом подсчитывает количество случаев. К сожалению, фреймворк java Collections - великолепен, так как у него нет пакета Bag. Для этого нужно использовать текст ссылки Apache Common Collection
источник
Способ 1:
Способ 2:
источник
Если вы используете Eclipse Collections , вы можете использовать
Bag
. AMutableBag
может быть возвращено из любой реализацииRichIterable
путем вызоваtoBag()
.HashBag
Реализация в Eclipse , Коллекции подкрепленаMutableObjectIntMap
.Примечание: я являюсь коммиттером для Eclipse Collections.
источник
Поместите элементы массива в hashMap для подсчета частоты.
источник
Java 8 - еще один метод
источник
Так что сделайте это по старинке и сверните свои собственные:
источник
Если вы являетесь пользователем моего ForEach DSL , это можно сделать с помощью
Count
запроса.источник
Я не хотел усложнять этот случай и сделал это с двумя итераторами. У меня есть HashMap с LastName -> FirstName. И мой метод должен удалить элементы с указателем FirstName.
источник
Вывод:
источник
источник
источник