个人常用工具类: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;
    private List<BaseTreeObj> childsList = new ArrayList<>();
}

TreeUtil.java

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 获得树形结构的工具类
 * 实际使用,可将BaseTreeObj直接覆盖为指定类
 */
public class TreeUtil {

    /**
     * 获得指定节点下所有归档
     * @param list
     * @param parentId
     * @return
     */
    public static List<BaseTreeObj> list2TreeConverter(List<BaseTreeObj> list, String parentId) {
        List<BaseTreeObj> returnList = new ArrayList<>();

        for (BaseTreeObj res : list) {
            //判断对象是否为根节点
            if (res.getParentId().equals(parentId)) {
                //该节点为根节点,开始递归
                recursionFn(list, res); //通过递归为节点设置childList

                returnList.add(res);
            }
        }

        return returnList;
    }

    /**
     * 递归列表
     * 通过递归,给指定t节点设置childList
     * @param list
     * @param t
     */
    public static void recursionFn(List<BaseTreeObj> list, BaseTreeObj t) {
        //只能获取当前t节点的子节点集,并不是所有子节点集
        List<BaseTreeObj> childsList = getChildList(list, t);
        //设置他的子集对象集
        t.setChildsList(childsList);

        //迭代子集对象集
        for (BaseTreeObj nextChild : childsList) { //遍历完,则退出递归

            //判断子集对象是否还有子节点
            if (!CollectionUtils.isEmpty(childsList)) {
                //有下一个子节点,继续递归
                recursionFn(list, nextChild);
            }
        }
    }   /**
     * 获得指定节点下的所有子节点
     * @param list
     * @param t
     * @return
     */
    public static List<BaseTreeObj> getChildList(List<BaseTreeObj> list, BaseTreeObj t) {
        List<BaseTreeObj> childsList = new ArrayList<BaseTreeObj>();
        //遍历集合元素,如果元素的Parentid==指定元素的id,则说明是该元素的子节点
        for (BaseTreeObj t1 : list) {
            if (t1.getParentId() .equals(t.getId()) ) {
                childsList.add(t1);
            }
        }

        return childsList;
    }   /**
     * 判断是否还有下一个子节点
     * @param list
     * @param t
     */
    public static boolean hasChild(List<BaseTreeObj> list, BaseTreeObj t) {
        return getChildList(list, t).size() > 0 ? true : false;
    }

}

原文地址:https://www.cnblogs.com/jiang4yu/p/11206613.html

时间: 2024-08-07 01:50:31

个人常用工具类:JAVA树形结构工具类01的相关文章

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

JAVA树形结构工具类02 TreeNode import java.util.ArrayList; import java.util.List; /** * Created by Ace on 2017/6/12. */ public class TreeNode { protected int id; protected int parentId; List<TreeNode> children = new ArrayList<TreeNode>(); public List&

java 树形结构工具类

   好久就想写博客了,苦苦因为没时间...没关系.从现在开始,每天我都会努力抽出点时间来进行做一次总结.把我认为在项目需求中认为很有用的东西,展示给大家,希望大家一起学习,一起进步.第一次做总结,写的不好的,提出来一起学习,谢谢.    分析:   在业务需求总,我们总会碰到一些业务.比如:对上下级的用户关系进行遍历,对资源权限进行遍历...等等.这些业务非常常见.在同一个项目中,他的代码遍历都是类似的,为了更高效的复用代码,我们有必要进行深成次的封转.下面是我花了一点时间进行封装,有需要直接

解析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_

Java内存结构、类的初始化、及对象构造过程

概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的读写过程:除了在执行我们写的显式的可见代码外,Jvm还会自动帮我们帮一些事,包括类的加载.初始化.GC等,这些也不特殊.以下分别来说下这些概念. Java内存结构.类的初始化.及对象构造过程

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

用HTML写伪类选择器,结构伪类选择器,伪元素选择器样式

html,css lorem乱序铭文 Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nesciunt, nihil? Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nesciunt, nihil? Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nesciunt, nihil? Lorem

几何对象的结构和类

为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类.这些结构和类分别定义在头文件windef.h和afxwin.h中. 1.点 1)点结构POINT 点数据结构POINT用来表示一点的x.y坐标: typedef struct tagPOINT { LONG x; LONG y; } POINT; 2)点类CPoint 点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种: CPoint( ); CPoint( int initX, i

MyEclipse建立树形结构包

温馨提示:本文是一个java菜鸟对其他新手朋友在新建java包时所遇问题的解释,高手请绕道哦~~~~ 随便一个java项目中免不了有多层嵌套的包: 对一个过了计算机一级的孩子来说,建立如上几个嵌套的树状java包肯定都不在话下吧? 说来可笑,昨天晚上,在MyEclipse中建立这几个包浪费了老子半个小时! 别笑我!我相信不少人当初用的时间比我还多!哈哈~~开个玩笑~~ 以本文开头那个项目的包结构为例,我的思路是,①先建立顶层包com,②再在com包下建立第二层包jypt,③再在jypt包下面建立

纯css实现树形结构

纯css实现属性结构 **css实现属性结构的思路是利用伪类实现树形结构连接线,如果想实现点击展开和收 缩以及复选框效果还得配合js来实现.其实展开和收缩就是一个点击元素其子元素隐藏 和显示的切换.** 效果图 html结构 <ul class="domtree"> <li> 1级菜单 <ul> <li>2级菜单</li> <li> 2级菜单 <ul> <li>3级菜单</li>