【问题标题】:Convert List<Long> to Map<Long, Long> that counts occurrences将 List<Long> 转换为 Map<Long, Long> 计算出现次数
【发布时间】:2014-03-25 07:48:10
【问题描述】:

我正在玩 Java 8,我知道这必须通过阅读文档来实现,我只是不知道该怎么做。

我有以下工作代码:

    long factorProduct = LongStream.rangeClosed(1, maxFactor)
            .filter(this::isOptimalFactor)
            .reduce((i, j) -> i * j)
            .getAsLong();
    List<Long> primeFactors = primeFactors(factorProduct);

重要的是我有一个List&lt;Long&gt;可能在某些Long 号码上有重复。

现在我想将其转换为 Map&lt;Long, Long&gt;,其中元素作为键,出现次数作为值。

我以为:

    Map<Long, Long> primeFactorCount = primeFactors.stream()
            .collect(Collectors.counting());

会起作用,但不会。我查了in the java.util.stream.Collectors documentation的例子。

我需要如何使用这些功能?

【问题讨论】:

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


    【解决方案1】:

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

    import static java.util.stream.Collectors.*;
    
    Map<Long, Long> primeFactorCount = primeFactors.stream()
            .collect(groupingBy(p -> p, counting()));
    

    【讨论】:

    • 我之前试过了,但是报错了,原来我忘记自动导入java.util.Map了。
    【解决方案2】:

    如果您使用Eclipse Collections,您可以将以下用于主要因素列表和主要因素计数。 Bag 基本上是 Map&lt;K, Integer&gt;

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

    在上面的 primeFactors 方法中使用 FastList

    对于 Eclipse Collections,我们有原始的 Lists 和 Bags,因此您不需要对任何结果进行装箱。

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

    在上面的 primeFactors 方法中使用 LongArrayList

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-07
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多