将List <long>转换为Map <long,long =“”>,用于计算出现次数</long,> </long>

时间:2014-02-23 20:53:33

标签: java dictionary java-8 java-stream collectors

我正在玩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());

会起作用,但事实并非如此。我查看了示例in the java.util.stream.Collectors documentation

我如何使用这些功能?

2 个答案:

答案 0 :(得分:11)

如果要对元素进行分组,则必须使用groupingBy

import static java.util.stream.Collectors.*;

Map<Long, Long> primeFactorCount = primeFactors.stream()
        .collect(groupingBy(p -> p, counting()));

答案 1 :(得分:2)

如果您使用Eclipse Collections(以前为GS Collections),则可以使用以下内容作为素数因子列表和素因子计数。 Bag基本上是Map<K, Integer>

MutableList<Long> primeFactors = this.primeFactors(factorProduct); 
Bag<Long> primeFactorCount = primeFactors.toBag();

在上面的primeFactors方法中使用FastList

对于Eclipse Collections,我们有原始列表和包,因此您不需要输入任何结果。

LongList primeFactors = this.primeFactors(factorProduct);   
LongBag primeFactorCount = primeFactors.toBag();

在上面的primeFactors方法中使用LongArrayList

注意:我是Eclipse Collections的提交者。