【Java精品源码栏目提醒】:网学会员鉴于大家对Java精品源码十分关注,论文会员在此为大家搜集整理了“java 树报表 - 其它资料”一文,供大家参考学习
(原创)统计分析系统中的树形结构统计报表--利用加权多叉树实现一、由 TreeGrid 树形结构表格想到的在阅读本文之前,请先依次阅读我的前两篇文章:分别是《多叉树结合JavaScript 树形控件实现无限级树形菜单(一种构建多级有序树形结构 JSON(或 XML)数据源的方法)》http://www.iteye.com/topic/1122125和《(原创)新概念智能树形菜单--利用加权多叉树结合 JavaScript 树形控件实现》http://www.iteye.com/topic/1122737,这两篇文章是本文的基础,本文就是在前两篇文章的基础上联想到的,“多叉树”的概念是在第一篇文章里面提出来的,“加权多叉树”的概念是在第二篇文章里提出来的,这三篇文章的思路具有连贯性,顺序不能颠倒。
让我们先回顾一下我的第一篇文章中提到的关于 TreeGrid 树形表格的部分:利用多叉树可以实现树形表格的三个主要功能,分别是:1、一次性构造树形表格,实现数据分级展示2、通过更换比较器,实现对不同表格列的全排序(全排序指的是对所有页的数据进行排序,而不是只对当前页的数据排序)3、实现对树形表格的完整分页(每次分页时,只取固定数目的第一层节点,之后调用 toString 方法,展示出完整条数的分级数据)如图所示:在统计分析系统中,可以利用这种树形表格实现维度钻取功能,逐级钻取查看更细粒度的指标数据,那么如何根据维度层次和最细粒度的指标数据,汇总生成这样一个树形结构指标统计报表呢?我在第二篇文章中论述了如何利用加权多叉树实现智能树形菜单,那么这张树形报表能否再智能一些呢?能否利用加权多叉树挖掘出更深层次的用户信息呢?带着这两个问题,让我们从分析这棵多叉树开始。
。
。
。
。
。
假设某统计分析系统对各个地区的居民家庭收入情况进行统计分析,前端报表展现模块首先需要将数据库中的客户级(这里的“客户”指的是一个一个的家庭,以家庭为单位)细粒度指标数据按照行政地区的维度层次进行逐级汇总后,在内存中构造一棵加权多叉树,每个节点的默认权值都为 1,如图所示:这棵树构造好之后,就可以通过先序遍历递归输出树形报表了。
假设需要做一张各个地区的居民家庭收入情况树形统计报表,通过逐级汇总和数据钻取,我们可以查看各个地区的居民家庭收入情况,最高层可以汇总到省级,最细粒度可以分解到家庭,这只是一个家庭收入统计上的简单分析,能否在此基础上进一步挖掘出一些其他的东西呢?由于这颗树的叶子节点代表一个一个的家庭,我们能否从叶子节点中分析出一些东西呢?受智能树形菜单(见第二篇文章)的启发,在原有的树形报表中可以再提供两个功能:加权排序和客户筛选重新汇总。
现在先对两个概念做一下定义:1、加权排序指的是对分支路径(分支路径指的是从根节点到叶子节点的一条完整路径,例如“东北地区-gt黑龙江-gt哈尔滨-gt道外区-gt王小利”)增加权值,然后对整棵树进行兄弟节点横向排序,展示出排序之后的树形报表。
2、客户筛选,重新汇总指的是从叶子节点中搜索到满足某一条件的叶子,然后从叶子节点开始,重新向上汇总指标数据,汇总数据时可以采用倒遍历的方法,所谓倒遍历,指的是从叶子节点开始,向上遍历节点,直到根节点,在遍历的过程中对节点数据进行汇总,在进行倒遍历之前,需要对除叶子之外的节点数据清零,然后对所有搜索到的叶子节点进行倒遍历汇总。
这里提到的“倒遍历汇总”,正是解决前面第一个问题的方法:根据维度层次和最细粒度的指标数据,汇总生成树形结构。
现在对这两个概念分别举例,先说加权排序吧:假设有这样一个需求,政府的分析人员不想按照各个行政地区下的家庭平均月收入的高低对报表进行排序,而是要换一种排序的方式,以便进一步挖掘出各地区家庭平均月收入背后隐藏的信息,比如在某一个区县的家庭平均月收入中,哪些家庭的月收入比较低,比如某区县的家庭平均月收入是 7000 元,其中月收入1000 元以下的家庭有 800 个,其余都是月收入大于 1000 元的家庭,能不能在树形报表的展示上体现这些信息。
比如将贫困家庭数量多的区县排在前面,贫困家庭数量少的区县排在后面,所谓贫困家庭,指的是家庭平均月收入小于一定额度的家庭,例如平均月收入小于 1000 元的家庭为贫困家庭,政府可以分析出哪些地区的贫困家庭数量最多,哪些地区的贫困家庭数量最少,对贫困家庭数量最多的地区重点关注等等,甚至可以钻取到客户级,钻取到叶子节点,看看具体哪些家庭是贫困家庭,详细了解他们的家庭成员信息及收入情况,然后对这些贫困家庭进行重点扶持,给予他们重点关注和优惠策略,做到“以人为本”。
当然,在一张报表中直接钻取到客户级,数据量太大了,在展现上也不太现实,可以变通一下,只在树形结构报表中展示客户级以上的汇总数据,最多钻取到客户级的上一级(例如钻取到区县级),当点击区县级的节点时,在界面中弹出一个子窗口,在这个子窗口中列出客户信息的数据列表。
要想实现这样的需求,需要对树中所有的叶子节点进行遍历,然后对贫困家庭的叶子节点所在的分支路径权值加 1,然后对树进行兄弟节点横向排序。
这是加权排序之后的树,如图所示:再说客户筛选,重新汇总:假设分析人员想在加权排序的基础上,过滤掉那些普通的家庭,只保留贫困家庭,只对贫困家庭的平均月收入进行统计。
要实现这种需求,需要对树中所有的叶子节点进行遍历,然后将贫困家庭的叶子节点所在的分支路径设置为可见,其它路径设置为不可见,然后对这些筛选出来的叶子节点进行倒遍历汇总,展示出筛选之后的树形报表,如图所示:好了,加了这两个新的概念之后,我们再梳理一下统计分析系统树形结构报表的功能:1)一次性构造多级数据列表,展现树形结构报表,实现数据钻取功能;2)可以按不同指标对树形结构报表进行全排序(例如按家庭平均月收入排序);3)实现对树形结构报表的完整分页(每次分页时,只取固定数目的第一层节点,展示出完整条数的分级数据,也就是说树形报表分页时,每页的总数据条数是不固定的,必须是一棵完整的树形结构);4)可以对树形结构报表进行加权排序,可以对任意级别的节点进行向上加权(所谓向上加权,指的是对该节点的所有上级节点(包括该节点在内)进行加权,被向上加权的节点必须处于同一层级(例如对区县级节点进行向上加权,加权的条件是家庭平均月收入小于 1000 元的区县),这样加权排序才有意义);5)可以对树形结构报表进行筛选并重新汇总,可以对任意级别的节点进行筛选(每次筛选必须筛选同一层级的节点(例如对区县级节点进行筛选,筛选的条件是家庭平均月收入小于1000 元的区县),这样筛选才有意义),筛选出来之后,将该节点的所有上级节点设置为可见,将该节点的所有下级节点设置为可见,其它节点设置为不可见。
现在需要我们把上面提到的两个概念修正一下,把“加权排序”修改为“同级节点向上加权排序”,把“客户筛选,重新汇总”修改为“同级节点筛选,向上重新汇总”,这样就恰当了。
现在让我们把注意力集中在“同级节点筛选,向上重新汇总”上,那么如何筛选同级节点呢?在我的第二篇文章中,筛选功能叶子时,采用的方法是:构造一个功能叶子列表,本质上是一个叶子节点对象的引用的数组,在 C 语言里面就是指针数组,然后循环遍
上一篇:
基于Java平台的应用系统技术架构规范(试行)_v1
下一篇:
电话销售英文简历范文