Java创建树形结构算法实例

在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  * @email [email protected] <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      * @email [email protected] <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     }
时间: 2024-10-05 04:25:58

Java创建树形结构算法实例的相关文章

java 实现树形结构

package tree; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTr

Java创建一个类的实例的方法

创建一个类的实例的方法有以下四种 一.通过new 来实现,也是最常用的 二.通过反射机制来实现 Class c = Class.forName("路径"): (1)java.lang.newInstance User use = (User)c.java.newInstance(); (2)java.lang.reflect.Constructor类的newInstance方法 Constructor con = c.getConstructor(String.class); User

JAVA 创建运行时类实例

摘自 b站尚硅谷JAVA视频教程 Class PersonC = Person.class; /* * 调用newInstance的条件: * 1 对应的类要提供空参构造器 * 2 空参构造器的访问权限应为public * * * */ Object p = PersonC.newInstance(); System.out.println(p); 通过运行时类,可以动态创建不同的类: int num = new Random().nextInt(3); String classPath = n

java 处理树形结构工具类

import com.alibaba.druid.util.StringUtils; import com.ywb.pms.vo.BaseTreeNode; import org.apache.commons.collections.CollectionUtils; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; import jav

个人常用工具类:JAVA树形结构工具类01

JAVA树形结构工具类 BaseTreeObj.java /** * 基层树形结构实体类 * 必备属性:id,parentId,childsList */ @Data public class BaseTreeObj implements Serializable { private static final long serialVersionUID = 1L; private String id; private String parentId; private String name; p

java构建树形节点优化

引言:java中构建树形节点时,数据量小的话,可以随便些 ,不影响,但是当数据量大了以后,一棵大大的树,要半天才出来,所以就想着优化一下. 树形节点数据构建: package me.zhengjie; import ch.qos.logback.classic.joran.action.RootLoggerAction; import com.alibaba.fastjson.JSON; import lombok.AllArgsConstructor; import lombok.Data;

十种JAVA排序算法实例

一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() {       for(int i=1;i<n;i++)       {         for(int j=0;i<n-i;j++) {               if(a[j]>a[j+1])//比较交换相邻元素                {                    int temp;                    temp=a[j]; a[j]=a[j+1]

《Java数据结构》树形结构

树形结构是一层次的嵌套结构. 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示.经典数据结构中的各种树形图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树. 左子树和右子树又有自己的子树. 结构图: 一切尽在代码中: import java.util.ArrayList; import java.util.List; public class TreeNode { private int age; // 节点属性,年龄 private String name

解析java树形结构

思路一: 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b.表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_