首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在列表上执行投影

在列表上执行投影
EN

Stack Overflow用户
提问于 2020-01-19 22:41:53
回答 2查看 132关注 0票数 1

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

代码语言:javascript
运行
复制
{ 
    { Key = 1, Value = { 1, 1, 1 } }, 
    { Key = 2, Value = { 2, 2 } }, 
    { Key = 3, Value = { 3 } } 
}

下面是这个分组的代码:

代码语言:javascript
运行
复制
Map<Integer, List<Integer>> groups = input.stream().collect(Collerctors.groupingBy(x -> x));

现在,对于这些组中的每一个,我想要获得配对。所以对于1,只有一对,最后一个1被省略了。对于2,我们也有一双,对于3,我们没有。所以我想得到每个组的大小,然后除以2。最后,我需要对所有这些结果进行求和。然而,我不知道如何在java中执行这样的投影。在C#中,我会这样做:

代码语言:javascript
运行
复制
var result = groups.Select(x => x.ToList().Count / 2).Sum();

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

代码语言:javascript
运行
复制
Integer result = groups.stream().collect(...)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-19 22:46:31

首先,您可以将一个counting Collector链接到groupingBy,这样Map的值就是每个组的元素数。

然后,您可以对这些值执行Stream操作,再除以2,然后计算和。

代码语言:javascript
运行
复制
input.stream()
     .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
     .values()
     .stream()
     .mapToLong(i -> i/2)
     .sum();

这将为示例输入返回2

票数 3
EN

Stack Overflow用户

发布于 2020-01-19 22:58:46

我通过使用Collectors.summingInt让它正常工作

代码语言:javascript
运行
复制
Integer result = groups.entrySet()
    .stream()
    .collect(Collectors.summingInt(x -> x.getValue().size() / 2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59811103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档