java - 在列表上执行投影
问题描述
我有一个按出现次数分组的数字列表。例如,我的列表是{ 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(...)
解决方案
首先,您可以将 a 链接counting
Collector
到groupingBy
,这样 的值Map
将是每个组的元素数。
然后您可以Stream
将这些值除以 2,然后计算总和。
input.stream()
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
.values()
.stream()
.mapToLong(i -> i/2)
.sum();
这将返回2
样本输入。
推荐阅读
- python - 如何修复标识符语法错误中的无效字符
- java - 如果我单击列表视图项目,我如何禁用一次列表视图?
- sql - 如何计算查询集中对的频率
- python - 从 laravel 运行 python
- python - raspberrypi uwsgi [503]:ModuleNotFoundError:没有名为“RPi”的模块
- python - 尝试在按下 html 按钮时运行 python 脚本
- amazon-web-services - 如何使用 Azure AD 应用程序验证对 AWS API Gateway RestAPI 的请求?
- html - 如何在 Angular 8 中通过匹配值来更改数据
- python - 带有套接字 connect_ex 的异步 rabbitmq 消费者
- python - Python 类(输入名称,输出编号)