在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创建树形结构算法实例的更多相关文章

  1. java返回树形结构的正确姿势

    业务场景 通常我们前端需要一个树形的导航菜单或者分类菜单,如后台权限管理中的权限树,亦或者下面例子中商城系统的商品分类多级菜单(一般为三级菜单) 数据库设计 数据库设计,采用parentId来指向自己 ...

  2. java 实现树形结构

    package tree; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java ...

  3. JAVA获取树形结构

    package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...

  4. Java实现树形结构的数据转Json格式

    在项目中难免会用到树形结构,毕竟这是一种常用的组织架构.楼主这里整理了两个实现的版本,可以直接拿来使用,非常方便. 楼主没有单独建项目,直接在以前的一个Demo上实现的.第一种,看下面代码: pack ...

  5. java后台树形结构展示---懒加载

    一.数据库设计 二.实体类:entity import com.joyoung.cloud.security.common.validatedGroup.Add;import com.joyoung. ...

  6. PHP无限级树形结构算法(递归和引用)

    测试数组 $array = [ [, , 'name' => '这是主类'], [, , 'name' => '这是主类'], [, , 'name' => '父级为1子类'], [ ...

  7. 编写Java程序,以树形结构显示国家-直辖市/省/州信息

    返回本章节 返回作业目录 需求说明: 以树形结构显示国家-直辖市/省/州信息 实现思路: 创建显示树形结构的类Tree,在该类中定义Map类型的全局实例属性countryMap,该Map集合用于存放所 ...

  8. 十种JAVA排序算法实例

    一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() {       for(int i=1;i<n;i++)       {         for ...

  9. 《Java数据结构》树形结构

    树形结构是一层次的嵌套结构. 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示.经典数据结构中的各种树形图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树. 左子 ...

随机推荐

  1. PHP 删除文件(图片)

    /** * 删除图片或文件 * @author Zhenwei Zhang <772979140@qq.com> * @param string $pic 图片或文件地址 */functi ...

  2. 数据导出到excel

    jsp页面: 数据table: <form action="/export.jsp" method="post" id="expform&quo ...

  3. Android深度探索--HAL与驱动开发----第七章读书笔记

    首先创建led驱动的设备文件,可以使用cdev_init,register_chrdev_region,cdev_add等建立主设备号的设备文件.步骤如下: 1使用cdev_init初始化cdev 2 ...

  4. centos6.4下面安装postgresql以及客户端远程连接

    一.安装 centos6.4服务器IP:192.168.220.131 window7客户端IP:192.168.199.218 在centos官网http://www.postgresql.org/ ...

  5. jfinal和httl结合

    一导入jar包 二配置web.xml文件 三配置httl.properties文件 此时会出现如下问题: 解决办法: 加入 javassist-3.15.0-GA.jar包 再运行会有如下警告 解决办 ...

  6. [解决方案] pythonchallenge level 3

    http://www.pythonchallenge.com/pc/def/equality.html 根据页面提示:一个小写字母刚刚好被左右3个大写字母包围. 查看页面代码得到需要处理的字符. 将字 ...

  7. php大力力 [050节] 兄弟连高洛峰 PHP教程 2014年[数据库、PDO教程]

    php大力力 [050节] 兄弟连高洛峰 PHP教程 2014年[数据库.PDO教程] 第14章 数据库252.[2014]兄弟连高洛峰 PHP教程14.1.1 复习数据库[已发布,点击下载]253. ...

  8. 【RobotFramework】Selenium2Library类库关键字使用说明

    Add CookieArguments:[ name | value | path=None | domain=None | secure=None | expiry=None ]Adds a coo ...

  9. IDEA 的 git 使用

    push的时候出现"push rejected": 1)先fetch: 2)然后选择branches--origin/master---rebaseOnto 3)再进行push,刚 ...

  10. js参数传递分析

    需要明白,js基本类型存放在栈,对象存放在堆. 结论:基本类型变量作为参数,不会改变变量值.对象变量作为参数,不修改属性(访问原始对象的操作),也不会改变变量值 起因,是群里一个问题: var a = ...