【发布时间】:2019-09-04 07:57:51
【问题描述】:
我需要用 Java 实现一个数据透视表,并且我知道如何使用 Java 8 Streams 功能。网上有很多很好的解决方案,但我需要更多的东西,但我不明白该怎么做:我需要创建一个更动态的表,理想情况下你不知道你必须聚合哪些列。 例如,如果我有列(“国家”、“公司”、“行业”、“员工人数”),我必须输入:
- 度量的自定义聚合函数(例如 sum)
- 可变的聚合顺序:例如,我想要 Nation 的第一个聚合,我将其作为参数“Nation”或 Nation 和 Company,并将其作为参数,例如“Nation->Company”。 换句话说,我不知道哪些是我的聚合字段,基本上我需要一种方法来实现一个通用的 GROUP BY SQL 子句,比如:
// Given an the Arraylist ("Nation", "Company", "Industry","Number of employes") called data with some rows
Map<String, List<Object[]>> map = data.stream().collect(
Collectors.groupingBy(row -> row[0].toString() + "-" + row[1].toString()));
for (Map.Entry<String, List<Object[]>> entry : map.entrySet()) {
final double average = entry.getValue().stream()
.mapToInt(row -> (int) row[3]).average().getAsDouble();
这不是我需要的,因为它太明确了。
我需要:
- 按我从数据中提取的标题名称给出的值将输入 Arraylist 拆分到子列表中(或更多,这取决于我必须分组的列数)
- 聚合每个子列表
- 合并子列表
有人可以帮助或鼓励我吗?谢谢
【问题讨论】:
-
是否只有两列来执行分组?
-
不,我可以对任何列执行分组。问题是我不确定,所以 group by 必须是通用的
-
提供您正在使用的数据结构、示例输入和所需输出(以代码而非文字形式),以及该输入的给定代码的输出。
-
例如
Map<String, List<Object[]>> output = pivot(data, "sum", "Nation->Company"),但输入和输出可以是任何东西(在我的示例中,输入data是List<Object[])。抛开自定义聚合函数,我不明白如何自定义最后一个参数,因为它可以由用户选择,所以我必须创建一个结构来动态选择分组依据的字段并将其放入Collectors.groupingBy功能中。 -
非常不清楚。 Edit 我要求的信息的问题。逐步解释您的起点、中间状态和最终需要的输出。您提供了一些晦涩的
pivot方法,但没有说明参数是什么以及从哪里读取它们,请在编辑中解释所有内容。
标签: java collections group-by pivot java-stream