用 Java 组装树形 List 数据

本贴最后更新于 1117 天前,其中的信息可能已经沧海桑田

1. 节点 model 类

package com.huiyou.yzf.tree; import java.util.List; public class TreeNode { private String id; //编号(不一定是主键) private String parentId; //父级编号 private String text; //显示名称 private String state;//combotree 设置为closed 则默认此节点不展开 private List<TreeNode> children; public TreeNode(String id, String text, String parentId) { this.id = id; this.parentId = parentId; this.text = text; } public TreeNode(String id, String text, TreeNode parent) { this.id = id; this.parentId = parent.getId(); this.text = text; } public TreeNode(String id, String text, String parentId,String state) { this.id = id; this.parentId = parentId; this.text = text; this.state = state; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getId() { return id; } public void setId(String id) { this.id = id; } public List<TreeNode> getChildren() { return children; } public void setChildren(List<TreeNode> children) { this.children = children; } public String getState() { return state; } public void setState(String state) { this.state = state; } @Override public String toString() { return "TreeNode{" + "id='" + id + '\'' + ", parentId='" + parentId + '\'' + ", text='" + text + '\'' + ", state='" + state + '\''+ ", children=" + children + '}'; } }

2.树形 List 构造器(两种方式:1 循环 2 递归)---配有测试 main 方法

package com.huiyou.yzf.tree; import java.util.ArrayList; import java.util.List; public class TreeBuider { /** * 两层循环实现建树 * @param treeNodes 传入的树节点列表 * @return */ public static List<TreeNode> bulid(List<TreeNode> treeNodes) { List<TreeNode> trees = new ArrayList<TreeNode>(); for (TreeNode treeNode : treeNodes) { if ("0".equals(treeNode.getParentId())) { trees.add(treeNode); } for (TreeNode it : treeNodes) { if (it.getParentId().equals(treeNode.getId())) { if (treeNode.getChildren() == null) { treeNode.setChildren(new ArrayList<TreeNode>()); } treeNode.getChildren().add(it); } } } return trees; } /** * 使用递归方法建树 * @param treeNodes * @return */ public static List<TreeNode> buildByRecursive(List<TreeNode> treeNodes) { List<TreeNode> trees = new ArrayList<TreeNode>(); for (TreeNode treeNode : treeNodes) { if ("0".equals(treeNode.getParentId())) { trees.add(findChildren(treeNode,treeNodes)); } } return trees; } /** * 递归查找子节点 * @param treeNodes * @return */ public static TreeNode findChildren(TreeNode treeNode,List<TreeNode> treeNodes) { for (TreeNode it : treeNodes) { if(treeNode.getId().equals(it.getParentId())) { if (treeNode.getChildren() == null) { treeNode.setChildren(new ArrayList<TreeNode>()); } treeNode.getChildren().add(findChildren(it,treeNodes)); } } return treeNode; } public static void main(String[] args) { TreeNode treeNode1 = new TreeNode("1","广州","0"); TreeNode treeNode2 = new TreeNode("2","深圳","0"); TreeNode treeNode3 = new TreeNode("3","天河区",treeNode1); TreeNode treeNode4 = new TreeNode("4","越秀区",treeNode1); TreeNode treeNode5 = new TreeNode("5","黄埔区",treeNode1); TreeNode treeNode6 = new TreeNode("6","石牌",treeNode3); TreeNode treeNode7 = new TreeNode("7","百脑汇",treeNode6); TreeNode treeNode8 = new TreeNode("8","南山区",treeNode2); TreeNode treeNode9 = new TreeNode("9","宝安区",treeNode2); TreeNode treeNode10 = new TreeNode("10","科技园",treeNode8); List<TreeNode> list = new ArrayList<TreeNode>(); list.add(treeNode1); list.add(treeNode2); list.add(treeNode3); list.add(treeNode4); list.add(treeNode5); list.add(treeNode6); list.add(treeNode7); list.add(treeNode8); list.add(treeNode9); list.add(treeNode10); List<TreeNode> trees = bulid(list); System.out.println(trees); List<TreeNode> trees_ = buildByRecursive(list); System.out.println(trees_); } }

节点 model 类中属性 可根据实际情况进行改变,当 list 存在多级关系时,常会在 Java 组装成树形 Json 数据返回,将数据与节点 model 对应,用上述构造器 中任一方法都可实现 多级 list 数据组装,然后进行后续处理。

以前借鉴某位博主的,地址已找不到,最近又用到 ,在此记录一下,主要供日后使用。
————————————————
版权声明:本文为 CSDN 博主「牛肉炒刀削」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZaberyJava/article/details/81914857

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3196 引用 • 8215 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
luomuren
永夜降临之前,你都有改变的资格

推荐标签 标签

  • OnlyOffice
    4 引用 • 20 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 548 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 1 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 349 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    28 引用 • 197 回帖 • 32 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 293 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 48 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • Excel
    31 引用 • 28 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 759 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 35 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 4 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 81 关注
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    187 引用 • 318 回帖 • 255 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    410 引用 • 3588 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    57 引用 • 25 回帖 • 6 关注
  • RemNote
    2 引用 • 16 回帖 • 8 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖 • 1 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 703 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 9 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 445 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 2 关注