zoukankan      html  css  js  c++  java
  • 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 1025742048@qq.com <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 1025742048@qq.com <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     }
  • 相关阅读:
    深度学习GPU集群管理软件 OpenPAI 简介
    图片加数字盲水印
    Kubernetes核心概念简介
    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)
    【OfficeWebViewer】在线预览Word,Excel~
    【Java】大文本字符串滤重的简单方案
    Java应用集群下的定时任务处理方案(mysql)
    《将博客搬至CSDN》
    [转]Fiddler抓取Android真机上的HTTPS包
    [Java Collection]List分组之简单应用.
  • 原文地址:https://www.cnblogs.com/banning/p/6218633.html
Copyright © 2011-2022 走看看