java数据透视表_使用流实现Java数据透视表

该博客讨论了如何利用Java Streams实现数据透视表功能,包括SUM、COUNT、MAX、MIN和AVERAGE等操作。作者提供了示例代码,展示如何处理包含不同类型数据的对象列表,并在运行时动态计算。博客中还提出了一些遇到的问题,如类型转换和比较操作的疑问。
摘要由CSDN通过智能技术生成

我一直在为这个问题奋斗了几天。我正在尝试使用Java Streams创建Pivot功能。我只需要执行 SUM,COUNT,MAX,MIN和AVERAGE。对于输入,我给出了一个数据透视列索引,一个数据透视表索引,以及要计算的值。使用流实现Java数据透视表

捕获的数据是在列表中>,其中Object是String,Integer或Double。但直到运行时才会知道。我必须返回我的结果列表>。

我有MAX/MIN(我假设AVERAGE将类似于MAX和MIN)

为了枢转上的多个表中的值的麻烦,我创建一个类来使用我的我的第二groupingBy

这不会编译,我不知道要比较什么,在哪里将对象转换为int或者我甚至需要。我想用一条流完成这一切,但我不确定这是可能的。我做错了什么,或者我可以做不同的事情。提前致谢。

package pivot.test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

import java.util.Map;

import java.util.Optional;

import java.util.stream.Collectors;

public class PivotTest {

List> rows = new ArrayList>();

public PivotTest() throws Exception {

rows.add(Arrays.asList(new Object[]{ "East", "Boy", "Tee", 10, 12.00}));

rows.add(Arrays.asList(new Object[]{ "East", "Boy", "Golf", 15, 20.00}));

rows.add(Arrays.asList(new Object[]{ "East", "Girl", "Tee", 8, 14.00}));

rows.add(Arrays.asList(new Object[]{ "East", "Girl", "Golf", 20, 24.00}));

rows.add(Arrays.asList(new Object[]{ "West", "Boy", "Tee", 5, 12.00}));

rows.add(Arrays.asList(new Object[]{ "West", "Boy", "Golf", 12, 20.00}));

rows.add(Arrays.asList(new Object[]{ "West", "Girl", "Tee", 15, 14.00}));

rows.add(Arrays.asList(new Object[]{ "West", "Girl", "Golf", 10, 24.00}));

}

// Dynamic Max based upon Column, Value to sum, and an array of pivot rows

public void MaxTable(int colIdx, int valueIdx, int... rowIdx) {

Map> myList = newRows.stream().collect(

Collectors.groupingBy(r -> ((List) r).get(colIdx),

Collectors.groupingBy(r -> new PivotColumns(r, rowIdx),

Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(???)),

r -> ((List) r).get(valueIdx)))));

System.out.println("Dynamic MAX PIVOT"); System.out.println(myList);

}

public static void main(String[] args) {

try {

PivotTest p = new PivotTest();

System.out.println("\n\nStreams PIVOT with index values inside a List\n");

p.MaxTable(0, 3, new int[] { 2 });

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

class PivotColumns {

ArrayList columns;

public PivotColumns(

List objs, int... pRows) {

columns = new ArrayList();

for (int i = 0; i < pRows.length; i++) {

columns.add(objs.get(pRows[i]));

}

}

public void addObject(Object obj) {

columns.add(obj);

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((columns == null) ? 0 : columns.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

PivotColumns other = (PivotColumns) obj;

if (columns == null) {

if (other.columns != null)

return false;

} else if (!columns.equals(other.columns))

return false;

return true;

}

public String toString() {

String s = "";

for (Object obj : columns) {

s += obj + ",";

}

return s.substring(0, s.lastIndexOf(','));

}

}

2015-09-14

John H

+0

这是一个巨大的问题。您可能想要阅读有关提问*最小*。请参阅http://stackoverflow.com/help/mcve ---我没有走得太远,但是你说你有一个'List'对象,可以是'String','Integer'或'Double',直到运行时才会知道,但随后您将继续显示一个定义良好的完全键入的“Row”类。那么,你知道与否? –

+0

任何特殊原因,它*有*为流? –

+0

不,我完全接受其他不涉及流的解决方案。 –

杰笛数据透视表Pivot Grid 杰笛数据透视表格利用Java/Swing实现了在Microsoft Excel里面非常著名的数据透视表PivotTable)功能。这个功能也在很多数据分析和OLAP应用程序里出现过。数据透视表的特点就是帮助您从一堆看似杂乱的数据里找到您想要的趋势或者规律,所以把Pivot Table翻译成数据透视表,倒是很贴切。您可以组织、统计、比较、排序,来找到对您感兴趣的方面有用的信息,就好像透视一样。有了杰笛数据透视表,您就可以把这样一个有用的工具集成到您的Java应用程序里,而不需要借助于第三方应用程序。该产品是建立在杰笛表格基础上的,并且充分利用了杰笛表格提供的各种表格功能。 功能介绍 支持从任何TableModel读取数据。至于TableModel,您可以从很多途径来产生,比如数据库,XML,文件,网络等等都可以。 用户可以用拖放来调整布局 自动计算出统计结果,包括SUM、MAX、MIN、MEAN、VAR、STDDEV、COUNT等等统计,您也可以引进自己的统计结果。 自动对行和列进行分类汇总和全部汇总。 对原始数据分类。 支持表格色彩、字体等等的调节,突出重点。 数据过滤功能。 数据排序功能。 支持衍生域,所谓衍生域就是从其它现有的域算出来的新的域,计算方法可以是一个自定义表达式。 支持保存布局到XML文件。 单独的AggregateTable控件,支持对数据进行分类合并,可以展开折叠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值