首页 > 解决方案 > 在列表上执行投影

问题描述

我有一个按出现次数分组的数字列表。例如,我的列表是{ 1, 2, 1, 1, 2, 3 }分组列表,如下所示:

{ 
    { Key = 1, Value = { 1, 1, 1 } }, 
    { Key = 2, Value = { 2, 2 } }, 
    { Key = 3, Value = { 3 } } 
}

这是该分组的代码:

Map<Integer, List<Integer>> groups = input.stream().collect(Collerctors.groupingBy(x -> x));

现在,对于这些组中的每一个,我都想要配对。所以因为1只有一对,最后一个1被省略了。因为2我们也有一对,因为3我们没有。所以我想得到每个组的大小并将其除以 2。最后我需要总结所有这些结果。但是我不知道如何在 java 中执行这样的投影。在 C# 中,我会做这样的事情:

var result = groups.Select(x => x.ToList().Count / 2).Sum();

我想在 Java 中我会使用collect-function,但我无法得到它:

Integer result = groups.stream().collect(...)

标签: javalambdajava-stream

解决方案


首先,您可以将 a 链接counting CollectorgroupingBy,这样 的值Map将是每个组的元素数。

然后您可以Stream将这些值除以 2,然后计算总和。

input.stream()
     .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
     .values()
     .stream()
     .mapToLong(i -> i/2)
     .sum();

这将返回2样本输入。


推荐阅读