Java创建树形结构算法实例代码

作者:路伟 时间:2021-11-21 22:24:01 

在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构。

首先是需要的JavaBean


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
* <Description> 菜单扩展<br>
*/
public class MenuExt implements Serializable {

/**
  * 菜单ID
  */
 private Long id;

/**
  * 菜单名称
  */
 private String name;

/**
  * 菜单地址
  */
 private String url;

/**
  * 菜单图标
  */
 private String icon;

/**
  * 父菜单ID
  */
 private Long parentId;

/**
  * 子菜单
  */
 private List<MenuExt> children = new ArrayList<MenuExt>();

/**
  * 菜单顺序
  */
 private Integer ordby;

/**
  * 菜单状态
  */
 private String state;

//省略Getter和Setter

/**
  *
  * <Description> 孩子节点排序<br>
  *
  */
 public void sortChildren() {
   Collections.sort(children, new Comparator<MenuExt>() {
     @Override
     public int compare(MenuExt menu1, MenuExt menu2) {
       int result = 0;

Integer ordby1 = menu1.getOrdby();
       Integer ordby2 = menu2.getOrdby();

Long id1 = menu1.getId();
       Long id2 = menu2.getId();
       if (null != ordby1 && null != ordby2) {
         result = (ordby1 < ordby2 ? -1 : (ordby1 == ordby2 ? 0 : 1));
       } else {
         result = (id1 < id2 ? -1 : (id1 == id2 ? 0 : 1));
       }
       return result;
     }

});
   // 对每个节点的下一层节点进行排序
   for (Iterator<MenuExt> it = children.iterator(); it.hasNext();) {
     it.next().sortChildren();
   }
 }

public List<MenuExt> getChildren() {
   return children;
 }

public void setChildren(List<MenuExt> children) {
   this.children = children;
 }
}

Java算法


public static List<MenuExt> createTreeMenus(List<MenuExt> menus) {
   List<MenuExt> treeMenus = null;
   if (null != menus && !menus.isEmpty()) {
     // 创建根节点
     MenuExt root = new MenuExt();
     root.setName("菜单根目录");

// 组装Map数据
     Map<Long, MenuExt> dataMap = new HashMap<Long, MenuExt>();
     for (MenuExt menu : menus) {
       dataMap.put(menu.getId(), menu);
     }

// 组装树形结构
     Set<Entry<Long, MenuExt>> entrySet = dataMap.entrySet();
     for (Entry<Long, MenuExt> entry : entrySet) {
       MenuExt menu = entry.getValue();
       if (null == menu.getParentId() || 0 == menu.getParentId()) {
         root.getChildren().add(menu);
       } else {
         dataMap.get(menu.getParentId()).getChildren().add(menu);
       }
     }

// 对树形结构进行二叉树排序
     root.sortChildren();
     treeMenus = root.getChildren();
   }
   return treeMenus;
 }

来源:http://www.cnblogs.com/banning/p/6218633.html

标签:java,树形结构
0
投稿

猜你喜欢

  • spring 整合mybatis后用不上session缓存的原因分析

    2021-12-09 10:11:03
  • Apache和Tomcat有什么区别_动力节点Java学院整理

    2023-08-15 08:49:44
  • java内部类原理与用法详解

    2022-12-04 14:41:25
  • C#实现文件上传下载Excel文档示例代码

    2023-01-09 20:53:23
  • springboot集成shiro权限管理简单实现

    2023-10-27 13:39:02
  • Spring缓存注解@Cacheable @CacheEvit @CachePut使用介绍

    2022-06-05 01:47:14
  • 基于WPF实现简单的文件夹比较工具

    2023-11-15 16:08:34
  • java文字转语音播报功能的实现方法

    2022-05-08 18:44:41
  • 以武侠形式理解Java LinkedList源码

    2021-12-27 20:34:23
  • Java 内置Http Server构建web应用案例详解

    2023-11-20 22:29:53
  • Feign调用可重试的最佳方案分享

    2021-06-09 12:19:23
  • JVM垃圾收集器详解

    2022-10-06 10:46:00
  • Java的Spring框架中AOP项目的一般配置和部署教程

    2021-07-26 16:49:25
  • Java时间复杂度、空间复杂度的深入详解

    2023-10-22 01:22:40
  • C#日期格式字符串的相互转换操作实例分析

    2021-09-01 10:06:56
  • 如何在IDE部署springboot项目(有swagger和无swagger都是一样的)到服务器或者虚拟机上的docker

    2023-09-01 00:33:25
  • JetCache 缓存框架的使用及源码解析(推荐)

    2021-07-23 12:21:25
  • Spring Boot Actuator自定义健康检查教程

    2022-06-12 14:54:59
  • C#中的值传递和引用传递详细解析

    2022-03-20 20:11:02
  • Java实现画图 给图片底部添加文字标题

    2023-03-28 23:23:06
  • asp之家 软件编程 m.aspxhome.com