【问题标题】:Java 8 int array to mapJava 8 int 数组映射
【发布时间】:2019-06-01 12:11:56
【问题描述】:

我想将 int 数组 转换为

Map<Integer,Integer> 

使用 Java 8 流 api

int[] nums={2, 7, 11, 15, 2, 11, 2};
Map<Integer,Integer> map=Arrays
                .stream(nums)
                .collect(Collectors.toMap(e->e,1));

我想得到一个像下面这样的地图,键是整数值,值是每个键的总数

map={2->3, 7->1, 11->2, 15->1}

编译器抱怨“不存在类型变量 T、U 的实例,因此 Integer 向 Function 确认

感谢任何解决此问题的指针

【问题讨论】:

  • Arrays.stream(nums).boxed().collect(Collectors.toMap(Function.identity(), i -&gt; 1, Integer::sum));

标签: java java-8 java-stream


【解决方案1】:

您需要将IntStream 装箱,然后使用groupingBy 值来获取计数:

Map<Integer, Long> map = Arrays
        .stream(nums)
        .boxed() // this
        .collect(Collectors.groupingBy(e -> e, Collectors.counting()));

或使用reduce

Map<Integer, Integer> map = Arrays
        .stream(nums)
        .boxed()
        .collect(Collectors.groupingBy(e -> e,
                Collectors.reducing(0, e -> 1, Integer::sum)));

【讨论】:

  • 感谢解答,如果map值只是1而不是key count,是否可以通过修改来使用Collectors.toMap(e->e,1)
  • @Buddhi,不,应该是...Collectors.toMap(e-&gt;e,v-&gt;1)...
  • @HadiJ 但在这种特定情况下您需要Collectors.toMap(e-&gt;e, v-&gt;1, Integer::sum) 来处理重复项。
  • @Holger,是的,我的意思是...toMap(e-&gt;e,1)。感谢清理
【解决方案2】:

您必须在 Stream 上调用 .boxed() 才能将 IntStream 转换为 Stream&lt;Integer&gt;。然后您可以使用Collectors.groupingby()Collectors.summingInt() 来计算值:

Map<Integer, Integer> map = Arrays.stream(nums).boxed()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(i -> 1)));

【讨论】:

    【解决方案3】:

    您也可以在不将int 值装箱到Map&lt;Integer, Integer&gt;Map&lt;Integer, Long&gt; 的情况下完成整数计数。如果您使用Eclipse Collections,您可以将IntStream 转换为IntBag,如下所示。

    int[] nums = {2, 7, 11, 15, 2, 11, 2};
    IntBag bag = IntBags.mutable.withAll(IntStream.of(nums));
    System.out.println(bag.toStringOfItemToCount());
    

    输出:

    {2=3, 7=1, 11=2, 15=1}
    

    您也可以直接从int 数组构造IntBag

    IntBag bag = IntBags.mutable.with(nums);
    

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

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多