当前位置: 首页 > news >正文

最便宜的购物软件长沙seo代理商

最便宜的购物软件,长沙seo代理商,手机站模板,公益机构网站建设方案背景 最近公司的项目使用了若依框架做开发#xff0c;发现部门管理功能的部门如果有3万笔记录时#xff0c;查询部门信息并组装为父子结构时运行特别缓慢#xff0c;本地运行需要3分钟才能加载出来#xff0c;因此接到优化的工作。 代码展示 首先看看表结构是这么定义的…背景 最近公司的项目使用了若依框架做开发发现部门管理功能的部门如果有3万笔记录时查询部门信息并组装为父子结构时运行特别缓慢本地运行需要3分钟才能加载出来因此接到优化的工作。 代码展示 首先看看表结构是这么定义的下列代码仅保留当前博文分析的内容 create table sys_dept (dept_id bigint(20) not null auto_increment comment 部门id,parent_id bigint(20) default 0 comment 父部门id,ancestors varchar(50) default comment 祖级列表,dept_name varchar(30) default comment 部门名称,order_num int(4) default 0 comment 显示顺序,status char(1) default 0 comment 部门状态0正常 1停用-- 省略其他字段primary key (dept_id) ) engineinnodb auto_increment1 comment 部门表;父子结构的类对象如下 public class TreeSelect implements Serializable {/** 节点ID */private Long id;/** 节点名称 */private String label;/** 子节点 */private ListTreeSelect children;// 省略setter/getter等其他内容 }查询数据就是简单的把sys_dept表内容全查出来然后在java中遍历每行找到子级找子级的代码如下 /*** 建立部门树型结构数据, 用于前端使用el-tree进行展示* param depts 所有部门结果集*/ public ListTreeSelect buildDeptTreeSelect(ListSysDept depts) {ListSysDept deptTrees buildDeptTree(depts);return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); } /*** 找到每个部门记录的子级集合, 建立部门树型结构* param dept 查询条件*/ public ListSysDept buildDeptTree(ListSysDept depts) {ListSysDept returnList new ArrayListSysDept();ListLong tempList depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());for (SysDept dept : depts) {// 如果是顶级节点, 遍历该父节点的所有子节点if (!tempList.contains(dept.getParentId())) {recursionFn(depts, dept);returnList.add(dept);}}if (returnList.isEmpty()) {returnList depts;}return returnList; } /*** 递归列表*/ private void recursionFn(ListSysDept list, SysDept t) {// 得到子节点列表ListSysDept childList getChildList(list, t);t.setChildren(childList);for (SysDept tChild : childList) {if (hasChild(list, tChild)) {recursionFn(list, tChild);}} } /*** 得到子节点列表*/ private ListSysDept getChildList(ListSysDept list, SysDept t) {ListSysDept tlist new ArrayListSysDept();IteratorSysDept it list.iterator();while (it.hasNext()) {SysDept n (SysDept) it.next();if (StringUtils.isNotNull(n.getParentId()) n.getParentId().longValue() t.getDeptId().longValue()) {tlist.add(n);}}return tlist; }/*** 判断是否有子节点*/ private boolean hasChild(ListSysDept list, SysDept t) {return getChildList(list, t).size() 0; }问题分析 通过分析上面的代码可以得出以下问题 使用List集合进行查找时间复杂度高buildDeptTree中先通过遍历获取所有主键到List集合中用于后面再次遍历时用contains判断是否有父级元素在查询结果集中此处的ListLong tempList如果用Set类型来去重和查找元素效率会更高因为List查找的时间复杂度是O(n)Set的时间复杂度为O(1)重复获取子元素在recursionFn中的hasChild()方法判断是否存在子元素是再执行一遍getChildList()方法遍历获取所有子级然后判断子级的长度此处感觉白白花费了比较多时间通过List集合遍历获取子元素效率比较低要获取每个元素的子级每次都要遍历所有元素 解决思路 问题1将List修改为Set即可问题2和3既然用List找到子级遍历很慢能不能也用Set集合来减少遍历的次数将查询出的数据按父级parentId分组分组后的对象为groupByParentIdDepts这样一来分组后的值就是每个父级的子元素获取每个元素的子级只需要一次遍历用当前元素的deptId作为键就能直接取到子元素而判断是否有子元素也不用每次都遍历了直接通过groupByParentIdDepts获取值的长度大于0即可。 代码修改 修改的内容就集中在buildDeptTree和recursionFn两个方法了想直接获取修改后的项目代码可以看文章最后的相关链接哈~ public ListSysDept buildDeptTree(ListSysDept depts) {ListSysDept returnList new ArrayListSysDept();ListLong tempList depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());// 按父级分组MapLong, ListSysDept groupByParentIdDepts depts.stream().filter(dept - dept.getParentId() ! null).collect(Collectors.groupingBy(SysDept::getParentId));for (SysDept dept : depts) {// 如果是顶级节点, 遍历该父节点的所有子节点if (!tempList.contains(dept.getParentId())) {recursionFn(groupByParentIdDepts, dept);returnList.add(dept);}}if (returnList.isEmpty()) {returnList depts;}return returnList; }private void recursionFn(MapLong, ListSysDept groupByParentIdDepts, SysDept t) {// 得到子节点列表ListSysDept childList groupByParentIdDepts.get(t.getDeptId());if (childList ! null) {t.setChildren(childList);// 为每个子节点递归找到子节点for (SysDept tChild : childList) {recursionFn(groupByParentIdDepts, tChild);}} else {t.setChildren(new ArrayList(0));} } // hasChild方法也可以直接省略了。总结 这次的优化其实有点空间换时间的意思将每次遍历的元素缓存到Map中然后再通过Map去快速获取子级元素不知道上面的表述有没有说的够清楚。再就是这个框架大大减少了我们开发后台系统的开发时间有一点小问题也是瑕不掩瑜毕竟当数据量低的时候感知不大前期开发者可能也没想到有这么大数据量的部门为了开发效率也无可厚非啦。另外前端接收那么大数据怎么展示呢我们是引入了wchbrad/vue-easy-tree虚拟加载树组件来展示的不然前端也要卡顿好久这里就不过多阐述了下文也有链接可以直接跳转查看官方文档 大家有不同的见解都可以留下你们的评论哈或者直接到gitee上直接拉取修改也行。 相关链接 若依gitee 在gitee克隆后修改的代码 el-tree虚拟加载树组件vue-easy-tree
http://www.w-s-a.com/news/227338/

相关文章:

  • 服务器不是自己的做违法网站videopro wordpress
  • 北京建网站的公司哪个比较好网站开通告知书
  • 网站负责人 主体负责人黑龙江 建设监理协会网站
  • 手机网站焦点图代码建设工程质量检测网站
  • 墙绘做网站推广有作用没html网页制作用什么软件
  • 企业做网站有用吗网站推广的常用方法有哪些?
  • 景安做网站教程互联网小程序开发
  • 桂林北站离阳朔多远贵州省建设厅住房和城乡建设官网二建考试
  • 浙江省建设厅 网站是多少wordpress淘宝客一键
  • 网站流量少怎么做5个不好的网站
  • 随州网站建设有限公司个人申请注册公司需要多少钱
  • 东莞做商城网站建设wordpress批量下载外链图片
  • 新网站建设运营年计划书仓山区建设局招标网站
  • 网站开发天津网站建设项目组织图
  • 网站开发认证考试石家庄高端网站开发
  • 网站建设第一步怎么弄站酷网页
  • 设备网站模板江西的赣州网站建设
  • 邯郸营销型网站国际招聘人才网
  • hexo wordpress 主题织梦网站优化教程
  • 网站建设方案及上海市建设协会网站
  • 轴承外贸网站怎么做南宁网站排名优化公司哪家好
  • 沈阳企业网站建站郴州优化公司
  • cctv5+手机在线直播观看seo关键词排名优化方法
  • 网站建设公司怎么谈单怎么开通微信小程序商店
  • 深圳做网站案例一个服务器可以备案几个网站
  • 网络营销策划名词解释泉州百度推广排名优化
  • 一键生成网站的软件互联网营销师是干什么
  • 网站后台管理水印怎么做手机优化设置
  • 哪个网站做图文素材多wordpress++优化
  • 建设网站就选用什么样的公司网站类型分类有哪些