在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;
}

最新文章

  1. OBD K线抓包 III
  2. (转)c#.net常用字符串函数
  3. PHP之路——MySql查询语句
  4. oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
  5. IntelliJ IDEA的激活和汉化
  6. Angular学习笔记(一)
  7. 设计模式成长记(一) 抽象工厂模式(Abstract Factory)
  8. Android 极光推送造成IM服务绑定失败bug
  9. idea 2017破解的三种方式
  10. [Java] SpringMVC工作原理之四:MultipartResolver
  11. 2017-9-12-Linux移植&amp;驱动开发
  12. Effective Java 第三版——74. 文档化每个方法抛出的所有异常
  13. 如何修改隐藏Zblog/WordPress默认后台登录地址
  14. JavaScript prototype背后的工作原理
  15. [Java代码] Java是自学好还是参加培训班好?
  16. 设置同样字体大小,chrome浏览器有时字体偏大的解决办法(转)
  17. 多线程Java面试题总结
  18. S 导入值列表浏览器、值列表
  19. MVC捕获数据保存时的具体字段验证错误代码
  20. 机器学习-kNN(1)

热门文章

  1. C++类内存布局图(成员函数和成员变量分开讨论)
  2. Python学习路程day18
  3. C#语法知识
  4. CGAL
  5. Echarts 动态折线图
  6. /date(-62135596800000)转换正常格式的时间
  7. 【转】oracle内存分配和调优总结
  8. LintCode StrStr
  9. 同时有background-size background-positon 两个属性的时候,如何在合并的background样式中展示
  10. HomeBrew安装和卸载