前言:

在开发中,我们经常见到,前端展示树状结构的,这时候就需要后端去封装一个多级树结构对象,前端根据这样结构的数据去渲染数据,这篇文章讲的是如何封装成多级树结构对象。

正文:

1.先封装个树结构的对象

@Data
public class TreeDto {
private String id;
private String name;
private String pid;
private String isParent;
private List<TreeDto> childTreeDto; }

2.然后我把工具类代码粘贴下

public class TreeToolUtils {
private List<TreeDto> rootList; //根节点对象存放到这里 private List<TreeDto> bodyList; //其他节点存放到这里,可以包含根节点 public TreeToolUtils(List<TreeDto> rootList, List<TreeDto> bodyList) {
this.rootList = rootList;
this.bodyList = bodyList;
} public List<TreeDto> getTree(){ //调用的方法入口
if(bodyList != null && !bodyList.isEmpty()){
//声明一个map,用来过滤已操作过的数据
Map<String,String> map = Maps.newHashMapWithExpectedSize(bodyList.size());
rootList.forEach(beanTree -> getChild(beanTree,map));
return rootList;
}
return null;
} public void getChild(TreeDto treeDto,Map<String,String> map){
List<TreeDto> childList = Lists.newArrayList();
bodyList.stream()
.filter(c -> !map.containsKey(c.getId()))
.filter(c ->c.getPid().equals(treeDto.getId()))
.forEach(c ->{
map.put(c.getId(),c.getPid());
getChild(c,map);
childList.add(c);
});
treeDto.setChildTreeDto(childList); }
}

3.然后写个main方法来测试下

TreeDto treeDto = new TreeDto("1", "总店", "null", "true",null);
TreeDto treeDto1 = new TreeDto("2", "市分店", "1", "true",null);
TreeDto treeDto2 = new TreeDto("3", "县分店", "2", "true",null);
TreeDto treeDto3 = new TreeDto("710", "店长", "3", "true",null);
TreeDto treeDto4= new TreeDto("713", "财务部", "3", "true",null);
TreeDto treeDto5 = new TreeDto("20032", "后勤部", "3", "true",null);
TreeDto treeDto6 = new TreeDto("1909", "小王", "710", "false",null);
TreeDto treeDto7= new TreeDto("1974", "小张", "713", "false",null);
TreeDto treeDto8 = new TreeDto("388187", "佳佳", "20032", "false",null);
TreeDto treeDto9 = new TreeDto("1949", "阿达", "20032", "false",null);
ArrayList<TreeDto> rootList = new ArrayList<>();//根节点
ArrayList<TreeDto> bodyList = new ArrayList<>();//子节点
rootList.add(treeDto);
bodyList.add(treeDto1);
bodyList.add(treeDto2);
bodyList.add(treeDto3);
bodyList.add(treeDto4);
bodyList.add(treeDto5);
bodyList.add(treeDto6);
bodyList.add(treeDto7);
bodyList.add(treeDto8);
bodyList.add(treeDto9);
TreeToolUtils utils = new TreeToolUtils(rootList,bodyList);
List<TreeDto> result = utils.getTree();
String jsonString = JSONObject.toJSONString(result.get(0));
System.out.println(jsonString);
}

4.最后控制台打印出的结果格式化后,就是这样的数据啦,前端根据层级去渲染数据就行啦

{
    "childTreeDto": [{
        "childTreeDto": [{
            "childTreeDto": [{
                "childTreeDto": [{
                    "childTreeDto": [],
                    "id": "1909",
                    "isParent": "false",
                    "name": "小王",
                    "pid": "710"
                }],
                "id": "710",
                "isParent": "true",
                "name": "店长",
                "pid": "3"
            }, {
                "childTreeDto": [{
                    "childTreeDto": [],
                    "id": "1974",
                    "isParent": "false",
                    "name": "小张",
                    "pid": "713"
                }],
                "id": "713",
                "isParent": "true",
                "name": "财务部",
                "pid": "3"
            }, {
                "childTreeDto": [{
                    "childTreeDto": [],
                    "id": "388187",
                    "isParent": "false",
                    "name": "佳佳",
                    "pid": "20032"
                }, {
                    "childTreeDto": [],
                    "id": "1949",
                    "isParent": "false",
                    "name": "阿达",
                    "pid": "20032"
                }],
                "id": "20032",
                "isParent": "true",
                "name": "后勤部",
                "pid": "3"
            }],
            "id": "3",
            "isParent": "true",
            "name": "县分店",
            "pid": "2"
        }],
        "id": "2",
        "isParent": "true",
        "name": "市分店",
        "pid": "1"
    }],
    "id": "1",
    "isParent": "true",
    "name": "总店",
    "pid": "null"
}

原文:https://blog.csdn.net/jdk_wangtaida/article/details/87867620

Java代码实现封装多级树结构对象的更多相关文章

  1. Java代码质量改进之:同步对象的选择

    在Java中,让线程同步的一种方式是使用synchronized关键字,它可以被用来修饰一段代码块,如下: synchronized(被锁的同步对象) { // 代码块:业务代码 } 当synchro ...

  2. [改善Java代码] 推荐使用序列化实现对象的拷贝

    建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...

  3. Android NDK开发(五)--C代码回调Java代码【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...

  4. Java代码质量改进之:使用ThreadLocal维护线程内部变量

    在上文中,<Java代码质量改进之:同步对象的选择>,我们提出了一个场景:火车站有3个售票窗口,同时在售一趟列车的100个座位.我们通过锁定一个靠谱的同步对象,完成了上面的功能. 现在,让 ...

  5. 《java JDK7 学习笔记》之对象封装

    1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...

  6. Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...

  7. Java面向对象的基本概念(对象、封装、继承、多态、抽象、接口、泛型)

    对象:是一个自包含的实体,用一组可识别的特征和行为来标识. 类:具有相同的属性和功能的对象的抽象合集.(类关键字class,首字母大写). 实例:就是一个真实的对象. 实例化:创建对象的过程,关键字是 ...

  8. 【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。

    Eclipse中导入外部jar包 在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可. 工具/原料 Eclipse 需要 ...

  9. 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。

    如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...

随机推荐

  1. 题解P3711:【仓鼠的数学题】

    这题黑的丫!怎么会掉紫呢! noteskey 伯努利数... 这里 有介绍哟~ 写的非常详细呢~ 反正这题就是推柿子... 另外就是黈力算法的运用 QWQ 我们令 \(ANS(x)\) 为答案多项式, ...

  2. SQL中笛卡尔积-cross join的用法

    在数学中,笛卡尔乘积是指两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 假设集合A={a ...

  3. 【原创】大叔经验分享(46)用户提交任务到yarn报错

    用户提交任务到yarn时有可能遇到下面的错误: 1) Requested user anything is not whitelisted and has id 980,which is below ...

  4. 使用Redis构建全局并发锁

    谈起Redis的用途,小伙伴们都会说使用它作为缓存,目前很多公司都用Redis作为缓存,但是使用Redis仅仅作为缓存未免太大材小用了.深究Redis的原理后你会发现它有很多用途,在很多场景下能够使用 ...

  5. 微信小程序--家庭记账本开发--03

    组件.标签以及模板的使用 在一个微信小程序中,需要用到大量的组件,一些页面的设计也需要模板,在自己所学课程中,对于一些组件.标签模板的使用有了初步的了解. 1.组件 组件是数据和方法的简单封装,对于微 ...

  6. 在Linux下用gcc编译hello world

    1. 确保Linux系统里已经装好了gcc 测试:输入gcc后是如下的结果就说明已经安装成功 2. 创建HelloWorld.c 使用 touch 创建一个空文件; 用vim编辑 按下A或者I 插入 ...

  7. 《Ray Tracing in One Weekend》、《Ray Tracing from the Ground Up》读后感以及光线追踪学习推荐

    <Ray Tracing in One Weekend> 优点: 相对简单易懂 渲染效果相当好 代码简短,只看书上的代码就可以写出完整的程序,而且Github上的代码是将基类与之类写在一起 ...

  8. NEL程序员专用轻钱包 进入0.01状态了

    这个轻钱包能干什么,现在就能在测试网看个余额,转个帐,调用个合约. 而且功能非常程序员化 你会说是不是没啥用   但是他有非常有用,因为他可以很容易的拼出NEOGUI拼不出来的交易 比如参与ICO交易 ...

  9. (转)RBAC权限管理

    RBAC 模型作为目前最为广泛接受的权限模型 角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)与Privilege(权限,表示对Resource的一个 ...

  10. vue学习:安装及创建项目

    1.先安装npm 参考链接:https://www.cnblogs.com/Hao-Killer/p/7235398.html 查看npm版本:在终端输入:npm -v 2.在安装vue # 安装vu ...