package com.dsh.course.model.node; import com.dsh.constant.IsMenu; import java.util.*; /** * @author fengshuonan * @Description 菜单的节点 * @date 2016年12月6日 上午11:34:17 */ public class MenuNode implements Comparable { /** * 节点id */ private Long id; /** * 父节点 */ private Long parentId; /** * 节点名称 */ private String name; /** * 按钮级别 */ private Integer levels; /** * 按钮级别 */ private Integer ismenu; /** * 按钮的排序 */ private Integer num; /** * 节点的url */ private String url; /** * 节点图标 */ private String icon; private String ename; private String bname; public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } /** * 子节点的集合 */ private List children; /** * 查询子节点时候的临时集合 */ private List linkedList = new ArrayList(); public MenuNode() { super(); } public MenuNode(Long id, Long parentId) { super(); this.id = id; this.parentId = parentId; } public Integer getLevels() { return levels; } public void setLevels(Integer levels) { this.levels = levels; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public static MenuNode createRoot() { return new MenuNode(0L, -1L); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getParentId() { return parentId; } public void setParentId(Long parentId) { this.parentId = parentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public List getChildren() { return children; } public void setChildren(List children) { this.children = children; } public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public Integer getIsmenu() { return ismenu; } public void setIsmenu(Integer ismenu) { this.ismenu = ismenu; } @Override public String toString() { return "MenuNode{" + "id=" + id + ", parentId=" + parentId + ", name='" + name + '\'' + ", levels=" + levels + ", num=" + num + ", url='" + url + '\'' + ", icon='" + icon + '\'' + ", children=" + children + ", linkedList=" + linkedList + '}'; } /** * 重写排序比较接口,首先根据等级排序,然后更具排序字段排序 * * @param o * @return */ @Override public int compareTo(Object o) { MenuNode menuNode = (MenuNode) o; Integer num = menuNode.getNum(); Integer levels = menuNode.getLevels(); if (num == null) { num = 0; } if (levels == null) { levels = 0; } if (this.levels.compareTo(levels) == 0) { return this.num.compareTo(num); } else { return this.levels.compareTo(levels); } } /** * 构建页面菜单列表 */ public static List buildTitle(List nodes) { if (nodes.size() <= 0) { return nodes; } //剔除非菜单 nodes.removeIf(node -> node.getIsmenu() != IsMenu.YES.getCode()); //对菜单排序,返回列表按菜单等级,序号的排序方式排列 Collections.sort(nodes); return mergeList(nodes, nodes.get(nodes.size() - 1).getLevels(), null); } /** * 递归合并数组为子数组,最后返回第一层 * * @param menuList * @param listMap * @return */ private static List mergeList(List menuList, int rank, Map> listMap) { //保存当次调用总共合并了多少元素 int n; //保存当次调用总共合并出来的list Map> currentMap = new HashMap<>(); //由于按等级从小到大排序,需要从后往前排序 //判断该节点是否属于当前循环的等级,不等于则跳出循环 for (n = menuList.size() - 1; n >=0&&menuList.get(n).getLevels() == rank; n--) { //判断之前的调用是否有返回以该节点的id为key的map,有则设置为children列表。 if (listMap != null && listMap.get(menuList.get(n).getId()) != null) { menuList.get(n).setChildren(listMap.get(menuList.get(n).getId())); } if (menuList.get(n).getParentId()!=null&&menuList.get(n).getParentId()!=0) { //判断当前节点所属的pid是否已经创建了以该pid为key的键值对,没有则创建新的链表 currentMap.computeIfAbsent(menuList.get(n).getParentId(), k -> new LinkedList<>()); //将该节点插入到对应的list的头部 currentMap.get(menuList.get(n).getParentId()).add(0, menuList.get(n)); } } if (n <0) { return menuList; } else { return mergeList(menuList.subList(0, n+1), menuList.get(n).getLevels(), currentMap); } } }