在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构。
首先是需要的JavaBean
1
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.Comparator;
7 import java.util.Date;
8 import java.util.Iterator;
9 import java.util.List;
10
11 /**
12 * <Description> 菜单扩展<br>
13 *
14 * @author lu.wei<br>
15 * <br>
16 * @date 2016年12月19日 <br>
17 * @since V1.0<br>
18 * @see com.luwei.console.mg.entity <br>
19 */
20 public class MenuExt implements Serializable {
21
22 /**
23 * 菜单ID
24 */
25 private Long id;
26
27 /**
28 * 菜单名称
29 */
30 private String name;
31
32 /**
33 * 菜单地址
34 */
35 private String url;
36
37 /**
38 * 菜单图标
39 */
40 private String icon;
41
42 /**
43 * 父菜单ID
44 */
45 private Long parentId;
46
47 /**
48 * 子菜单
49 */
50 private List<MenuExt> children = new ArrayList<MenuExt>();
51
52 /**
53 * 菜单顺序
54 */
55 private Integer ordby;
56
57 /**
58 * 菜单状态
59 */
60 private String state;
61
62 //省略Getter和Setter
63
64
65 /**
66 *
67 * <Description> 孩子节点排序<br>
68 *
69 * @author lu.wei<br>
70 * <br>
71 * @date 2016年12月22日 下午10:54:26 <br>
72 * <br>
73 */
74 public void sortChildren() {
75 Collections.sort(children, new Comparator<MenuExt>() {
76 @Override
77 public int compare(MenuExt menu1, MenuExt menu2) {
78 int result = 0;
79
80 Integer ordby1 = menu1.getOrdby();
81 Integer ordby2 = menu2.getOrdby();
82
83 Long id1 = menu1.getId();
84 Long id2 = menu2.getId();
85 if (null != ordby1 && null != ordby2) {
86 result = (ordby1 < ordby2 ? -1 : (ordby1 == ordby2 ? 0 : 1));
87 } else {
88 result = (id1 < id2 ? -1 : (id1 == id2 ? 0 : 1));
89 }
90 return result;
91 }
92
93 });
94 // 对每个节点的下一层节点进行排序
95 for (Iterator<MenuExt> it = children.iterator(); it.hasNext();) {
96 it.next().sortChildren();
97 }
98 }
99
100 public List<MenuExt> getChildren() {
101 return children;
102 }
103
104 public void setChildren(List<MenuExt> children) {
105 this.children = children;
106 }
107 }
Java算法
1 public static List<MenuExt> createTreeMenus(List<MenuExt> menus) {
2 List<MenuExt> treeMenus = null;
3 if (null != menus && !menus.isEmpty()) {
4 // 创建根节点
5 MenuExt root = new MenuExt();
6 root.setName("菜单根目录");
7
8 // 组装Map数据
9 Map<Long, MenuExt> dataMap = new HashMap<Long, MenuExt>();
10 for (MenuExt menu : menus) {
11 dataMap.put(menu.getId(), menu);
12 }
13
14 // 组装树形结构
15 Set<Entry<Long, MenuExt>> entrySet = dataMap.entrySet();
16 for (Entry<Long, MenuExt> entry : entrySet) {
17 MenuExt menu = entry.getValue();
18 if (null == menu.getParentId() || 0 == menu.getParentId()) {
19 root.getChildren().add(menu);
20 } else {
21 dataMap.get(menu.getParentId()).getChildren().add(menu);
22 }
23 }
24
25 // 对树形结构进行二叉树排序
26 root.sortChildren();
27 treeMenus = root.getChildren();
28 }
29 return treeMenus;
30 }