Java创建树形结构算法实例
在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构。
首先是需要的JavaBean
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.List;
- /**
- * <Description> 菜单扩展<br>
- *
- * @author lu.wei<br>
- * @email 1025742048@qq.com <br>
- * @date 2016年12月19日 <br>
- * @since V1.0<br>
- * @see com.luwei.console.mg.entity <br>
- */
- public class MenuExt implements Serializable {
- /**
- * 菜单ID
- */
- private Long id;
- /**
- * 菜单名称
- */
- private String name;
- /**
- * 菜单地址
- */
- private String url;
- /**
- * 菜单图标
- */
- private String icon;
- /**
- * 父菜单ID
- */
- private Long parentId;
- /**
- * 子菜单
- */
- private List<MenuExt> children = new ArrayList<MenuExt>();
- /**
- * 菜单顺序
- */
- private Integer ordby;
- /**
- * 菜单状态
- */
- private String state;
- //省略Getter和Setter
- /**
- *
- * <Description> 孩子节点排序<br>
- *
- * @author lu.wei<br>
- * @email 1025742048@qq.com <br>
- * @date 2016年12月22日 下午10:54:26 <br>
- * <br>
- */
- public void sortChildren() {
- Collections.sort(children, new Comparator<MenuExt>() {
- @Override
- public int compare(MenuExt menu1, MenuExt menu2) {
- int result = 0;
- Integer ordby1 = menu1.getOrdby();
- Integer ordby2 = menu2.getOrdby();
- Long id1 = menu1.getId();
- Long id2 = menu2.getId();
- if (null != ordby1 && null != ordby2) {
- result = (ordby1 < ordby2 ? -1 : (ordby1 == ordby2 ? 0 : 1));
- } else {
- result = (id1 < id2 ? -1 : (id1 == id2 ? 0 : 1));
- }
- return result;
- }
- });
- // 对每个节点的下一层节点进行排序
- for (Iterator<MenuExt> it = children.iterator(); it.hasNext();) {
- it.next().sortChildren();
- }
- }
- public List<MenuExt> getChildren() {
- return children;
- }
- public void setChildren(List<MenuExt> children) {
- this.children = children;
- }
- }
Java算法
- public static List<MenuExt> createTreeMenus(List<MenuExt> menus) {
- List<MenuExt> treeMenus = null;
- if (null != menus && !menus.isEmpty()) {
- // 创建根节点
- MenuExt root = new MenuExt();
- root.setName("菜单根目录");
- // 组装Map数据
- Map<Long, MenuExt> dataMap = new HashMap<Long, MenuExt>();
- for (MenuExt menu : menus) {
- dataMap.put(menu.getId(), menu);
- }
- // 组装树形结构
- Set<Entry<Long, MenuExt>> entrySet = dataMap.entrySet();
- for (Entry<Long, MenuExt> entry : entrySet) {
- MenuExt menu = entry.getValue();
- if (null == menu.getParentId() || 0 == menu.getParentId()) {
- root.getChildren().add(menu);
- } else {
- dataMap.get(menu.getParentId()).getChildren().add(menu);
- }
- }
- // 对树形结构进行二叉树排序
- root.sortChildren();
- treeMenus = root.getChildren();
- }
- return treeMenus;
- }
Java创建树形结构算法实例的更多相关文章
- java返回树形结构的正确姿势
业务场景 通常我们前端需要一个树形的导航菜单或者分类菜单,如后台权限管理中的权限树,亦或者下面例子中商城系统的商品分类多级菜单(一般为三级菜单) 数据库设计 数据库设计,采用parentId来指向自己 ...
- java 实现树形结构
package tree; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java ...
- JAVA获取树形结构
package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...
- Java实现树形结构的数据转Json格式
在项目中难免会用到树形结构,毕竟这是一种常用的组织架构.楼主这里整理了两个实现的版本,可以直接拿来使用,非常方便. 楼主没有单独建项目,直接在以前的一个Demo上实现的.第一种,看下面代码: pack ...
- java后台树形结构展示---懒加载
一.数据库设计 二.实体类:entity import com.joyoung.cloud.security.common.validatedGroup.Add;import com.joyoung. ...
- PHP无限级树形结构算法(递归和引用)
测试数组 $array = [ [, , 'name' => '这是主类'], [, , 'name' => '这是主类'], [, , 'name' => '父级为1子类'], [ ...
- 编写Java程序,以树形结构显示国家-直辖市/省/州信息
返回本章节 返回作业目录 需求说明: 以树形结构显示国家-直辖市/省/州信息 实现思路: 创建显示树形结构的类Tree,在该类中定义Map类型的全局实例属性countryMap,该Map集合用于存放所 ...
- 十种JAVA排序算法实例
一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() { for(int i=1;i<n;i++) { for ...
- 《Java数据结构》树形结构
树形结构是一层次的嵌套结构. 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示.经典数据结构中的各种树形图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树. 左子 ...
随机推荐
- lightoj1348
//Accepted 6004 KB 924 ms /* source: lightoj1348 time :2015.5.29 by :songt */ /*题解: 树链剖分 */ #include ...
- WKWebView
按错了...,原帖地址http://blog.csdn.net/cyforce/article/details/37657009 webkit使用WKWebView来代替IOS的UIWebView和O ...
- 【Python】二分查找算法
二分查找:在一段数字内,找到中间值,判断要找的值和中间值大小的比较.如果中间值大一些,则在中间值的左侧区域继续按照上述方式查找.如果中间值小一些,则在中间值的右侧区域继续按照上述方式查找.直到找到我们 ...
- 我们正在等待一次技术革命的到来; We are waiting for the arrival of a technological revolution
In the future, there must be a significant technological revolution just like Industrial Revolution. ...
- iOS内置音频
Predefined soundsThere are some predefined system sounds, for the system sound ID in the range 1000 ...
- easyui 筛选数据及仅允许选择数据
先说需求,本地已缓存数据源,用户输入拼音码或编号,筛选数据作为新的数据源,然后通过键盘选择. 再说问题,easyui combogrid控件,在mode为local,也就是将数据源缓存在本地的情况下, ...
- JavaScript设计模式学习笔记
1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...
- WAMPserver配置(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)
对于很多不熟悉PHP环境安装的朋友来说,用集成环境可以更快的上手,更方便的搭建PHP的运行环境,但是,WAMP的集成环境仅仅是将底层基础工作做好 了,有些个别关键的配置操作并没有集成到环境安装中,所以 ...
- Network Assistant (Alpha)版使用说明
Network Assistant (网络助手)使用说明 本软件是一款帮助同学方便Ip更改,小蝴蝶断线重连,一键wifi,定时关机的软件.它集成 ...
- 【JS】falsy与truthy
1.Falsy值,当进行逻辑判断时均为false(如!!false==false).六个Falsy值:false.undefined.null.正负0.NaN."". 2.其余所有 ...