Преобразовать список в карту, которая считает вхождения
Я играю с Java 8 и знаю, что это должно быть возможно, читая документацию, я просто не могу понять, как это сделать.
У меня есть следующий рабочий код:
long factorProduct = LongStream.rangeClosed(1, maxFactor)
.filter(this::isOptimalFactor)
.reduce((i, j) -> i * j)
.getAsLong();
List<Long> primeFactors = primeFactors(factorProduct);
Важная часть состоит в том, что у меня есть List<Long>
, что может иметь дубликаты на некоторых Long
числах.
Теперь я хочу преобразовать его в Map<Long, Long>
с ключом элемента и значением события.
Я думал, что:
Map<Long, Long> primeFactorCount = primeFactors.stream()
.collect(Collectors.counting());
Сработало бы, но это не так. примеры в java.утиль.поток.Коллекционеры документации .
Как я должен использовать эти функции?
2 ответа:
Если вы хотите сгруппировать элементы, вы должны использовать
groupingBy
:import static java.util.stream.Collectors.*; Map<Long, Long> primeFactorCount = primeFactors.stream() .collect(groupingBy(p -> p, counting()));
Если вы используете коллекции Eclipse (ранее коллекции GS ), Вы можете использовать следующее для списка простых факторов и подсчета простых факторов. Сумка-это в основном
Map<K, Integer>
.MutableList<Long> primeFactors = this.primeFactors(factorProduct); Bag<Long> primeFactorCount = primeFactors.toBag();
Используйте a
FastList
в методе primeFactors выше.В случае коллекций Eclipse у нас есть примитивные списки и пакеты, поэтому вам не нужно будет упаковывать какие-либо результаты.
LongList primeFactors = this.primeFactors(factorProduct); LongBag primeFactorCount = primeFactors.toBag();
Используйте a
LongArrayList
вместо этого в методе primeFactors выше.Примечание: я коммиттер для коллекций Eclipse.