crud树型结构数据
小型数据,比如标签,部门之类的,可以组织数据,成层状结构,一并返回前端,节省请求次数;
但是大型数据,比如省市区等等联动,如果一并返回组织好的数据,查询量大,页面多次刷新,恶意请求,放入缓存还可以,其实还可以将这种数据直接放到前台,与后台无光关
对一张有树形结构的表查询:
1.获取该表下的所有数据
2.将数据转换成Dto集合,对集合进行遍历,将每一层级的数据分组,可以根据parentId,也可以根据表中的层级字段level等,产生Map<String,List<Dto>>类型,可以根据给定一个level,返回该level下的节点(单纯的一层节点)
3.收集所有根节点,List<Dto>
4.将List<Dto>,Map<String,List<dto>>,level作为三个参数,设置递归算法
void recursive(List<dto> list,Map<String,List<Dto>> map,Stirng level){
for(Dto dto:list){
List<Dto> li = map.get(dto.getLevel());
li集合的sort操作//对节点排序
dto.setListdto(li);//树形结构
recursive(li,map,dto.getLevel());
}
}
实例:
//1.将所有数据根据level分组(也可以根据parentId分组),这个map(level,List<dto>)帮助我们,给定一个level,返回该level下的节点
//2.收集所有根节点
public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelList) {
if (CollectionUtils.isEmpty(deptLevelList)) {
return Lists.newArrayList();
}
// level -> [dept1, dept2, ...] Map<String, List<Object>>
Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create();
List<DeptLevelDto> rootList = Lists.newArrayList(); for (DeptLevelDto dto : deptLevelList) {
levelDeptMap.put(dto.getLevel(), dto);
if (LevelUtil.ROOT.equals(dto.getLevel())) {
rootList.add(dto);
}
}
// 按照seq从小到大排序
Collections.sort(rootList, new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
});
// 递归生成树
transformDeptTree(rootList, LevelUtil.ROOT, levelDeptMap);
return rootList;
} public void transformDeptTree(List<DeptLevelDto> deptLevelList, String level, Multimap<String, DeptLevelDto> levelDeptMap) {
for (int i = 0; i < deptLevelList.size(); i++) {
// 遍历该层的每个元素
DeptLevelDto deptLevelDto = deptLevelList.get(i);
// 处理当前层级的数据
String nextLevel = LevelUtil.calculateLevel(level, deptLevelDto.getId());
// 处理下一层
List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptMap.get(nextLevel);
if (CollectionUtils.isNotEmpty(tempDeptList)) {
// 排序
Collections.sort(tempDeptList, deptSeqComparator);
// 设置下一层部门
deptLevelDto.setDeptList(tempDeptList);
// 进入到下一层处理
transformDeptTree(tempDeptList, nextLevel, levelDeptMap);
}
}
} public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() {
public int compare(DeptLevelDto o1, DeptLevelDto o2) {
return o1.getSeq() - o2.getSeq();
}
};
// public Comparator<DeptLevelDto> deptComparator = (x,y)->x.getSeq()-y.getSeq();
--------------------------java8版本-----------------------
public List<DeptLevelDto> deptListoTree(List<DeptLevelDto> collect) { if(CollectionUtils.isEmpty(collect)){
return Lists.newArrayList();
} //@1
List<DeptLevelDto> rootList = Lists.newArrayList();
rootList = collect.stream().filter(
x->x.getLevel().equals(LevelUtil.ROOT)
).collect(Collectors.toList()); //@2
Map<String, List<DeptLevelDto>> multiMap = collect.stream().collect(Collectors.groupingBy(
x -> x.getLevel(), Collectors.toList()
)); //对root排序:
Collections.sort(rootList,deptComparator);
transformDeptTree(rootList,LevelUtil.ROOT,multiMap);
return rootList;
//tip:@1和@2可以使用guava的multiMap,一个key对应多个value
} //递归生成树
public void transformDeptTree(List<DeptLevelDto> deptLevelList, String level, Map<String, List<DeptLevelDto>> levelDeptMap) { deptLevelList.stream().forEach(x->{
// 以该节点为父节点,寻找子节点集合
String childLevel = LevelUtil.calculateLevel(level, x.getId());
List<DeptLevelDto> child = levelDeptMap.get(childLevel); if(CollectionUtils.isNotEmpty(child)){//递归终止条件
Collections.sort(child,deptComparator);
x.setList(child);
transformDeptTree(child,childLevel,levelDeptMap);
}
}); }
crud树型结构数据的更多相关文章
- oracle 树型结构数据的查询
Oracle中start by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 con ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- Rafy 领域实体框架 - 树型实体功能(自关联表)
在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...
- Mac:文件夹树型展示 tree
目标: 想要在MAC的Terminal中查看文件夹中所有文件的树型结构及文件夹.文件树统计. 安装方法: 1.brew安装 官网:http://brew.sh/ brew是Mac中安装软件的神器,一定 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- RDIFramework.NET V2.7 Web版本升手风琴+树型目录(2级+)方法
RDIFramework.NET V2.7 Web版本升手风琴+树型目录(2级+)方法 手风琴风格在Web应用非常的普遍,越来越多的Web应用都是采用这种方式来体现各个功能模块,传统的手风琴风格只支持 ...
- dzzoffice的树型结构用户管理设计
在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...
- php实现无限级树型菜单(函数递归算法)
首先到数据库取数据,放到一个数组,然后把数据转化为一个树型状的数组,最后把这个树型状的数组转为html代码.也可以将第二步和第三步合为一步. 详细如下:1.数据库设计:脚本如下:CREATE TABL ...
- VC中实现带有背景位图的树型控件
当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C++编程爱好者来说,使用Visual C++MFC提供的树型控件(CTreeCtrl)本身就是一个难点, ...
随机推荐
- centos7.4上安装python3环境的坑
前言:为了将爬虫项目布置到服务器上,才有了今天这一下午的坑,必须记录 不要动现有的python2环境!不要动现有的python2环境!不要动现有的python2环境! 解压 tar -xvf Pyth ...
- eclipse环境的搭建(转载)
原文地址:http://hanqunfeng.iteye.com/blog/982182 此文章发表于2011年到2012年 使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给 ...
- 第十一章 串 (c2)KMP算法:查询表
- Centos 7 RabbitMQ + Haproxy 集群高可用部署
一. 功能和原理介绍 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionSc ...
- c++ - Linking problems due to symbols with abi::cxx11?
看错误内容: /data/projects/LipReadingSDKGPU/lib/cwlibs/libLipReading.so: undefined reference to `tensorfl ...
- 高德地图开发者平台获取sHA1值
一般在 Application 中进行初始化 /** * 获取高德SHA1值 * */ public static String sHA1(Context context) { try { Pack ...
- c#: Noto Sans字体如何支持韩文
1.源起: VCU10项目,使用了Noto Sans字体,的确漂亮.但验证在win7下,其显示韩文为乱码,颇为头痛. 其界面显示如图: 度娘之,得Noto Sans又有CJK字体,顾名思义,其为支持中 ...
- 489. Robot Room Cleaner扫地机器人
[抄题]: Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or block ...
- [leetcode]692. Top K Frequent Words K个最常见单词
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- ReactPHP── PHP版的Node.js(转)
原文地址:http://www.csdn.net/article/2015-10-12/2825887 摘要:ReactPHP作为Node.js的PHP版本.在实现思路,使用方法,应用场景上的确有很多 ...