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     }
    复制代码
  • 相关阅读:
    IE 插件 Trixie 介绍
    .net开发沉淀之:HttpHandler(一)
    在Eclipse中导入已经存在的jar包
    浏览器的GreaseMonkey和Trixie插件
    为什么export>runnable jar file的launch configuration没有东西可以选择?
    SQL2008:如何解决“阻止保存要求重新创建表的更改”
    在IIS6下部署MVC2.0的注意事项
    ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全问题警告的解决办法
    MyEclipse 设置JDK指向目录错误信息
    RHEL5.5 安装 oracle 11g
  • 原文地址:https://www.cnblogs.com/Darkqueen/p/9165659.html
Copyright © 2011-2022 走看看