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)本身就是一个难点, ...
随机推荐
- 【Scheme】符号求导
思路: 定义一个求导算法, 令其在抽象对象上执行求导操作. 可以由以下规约规则完成: dc/dx=0 dx/dx=1 d(u+v)/dx=du/dx+dv/dx d(uv)/dx=u(dv/dx)+v ...
- dbcp第一次获取连接的时间问题
最近优化代码,发现第一次调用数据库连接时非常慢,往后便不再发生.经了解,数据库连接是用dbcp管理的,想在网上查找答案,但没有找到.在某人的提醒下决定研究源代码: 部分源代码如下(BasicDataS ...
- 第二章 向量(a)接口与实现
- zabbix web 配置
一.汉化 1.在windows中找一些自己喜欢的字体: 2.将字体上传至/var/www/html/zabbix/fonts 目录下(我上传的字体为:simhei.ttf) 3.在/var/www/h ...
- HDU 6214 Smallest Minimum Cut(最少边最小割)
Problem Description Consider a network G=(V,E) with source s and sink t. An s-t cut is a partition o ...
- Redis 非关系性数据库集群的搭建与常用方法
redis 非关系型数据库,内存型数据库,现在大家都不陌生了,无论大中小型企业,都会将redis应用到自己的项目中,以此来减轻数据库的压力 安装步骤: 1.安装gcc 安装c语言的编译环境 yum i ...
- 2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告
2017-2018-2 20165315 实验三<敏捷开发与XP实践>实验报告 一.编码标准 编写代码一个重要的认识是"程序大多时候是给人看的",编程标准使代码更容易阅 ...
- connot connect to mysql 10061
根据我自己运行的情况,解决方法如下: 按windows+R, 输入services.msc查找服务,在服务与应用中找到MYsql服务,查看是否已启动.
- A Spectral Technique for Correspondence Problems Using Pairwise Constraints
Abstract 我们提出了一种有效的谱方法来寻找两组特征之间的一致对应关系.我们建立了一个图的邻接矩阵M,它的节点代表了潜在的对应,而链接上的权重代表潜在的对应之间的成对协议.正确的分配可在彼此之间 ...
- YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用
在使用YII2中自带的RBAC时,需要先配置config/web.php: return [ // ... 'components' => [ 'authManager' => [ 'cl ...