数据库 java tree_java—将数据库读取的list转tree

本文介绍了如何将从数据库读取的列表数据转换为树结构,以适应前端展示需求。通过创建TreeNode类和使用TreeUtil工具类,利用两层循环和递归方法将数据构建为树形结构。示例中展示了处理中国省市县数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言

有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID、名称与父节点ID,读出来的数据并不是前台想要的,这个时候我们要想法处理一下都出来的list,将它变为一个树。

比如直接查出来是图(1)的数据,我们要的效果是图(2)的数据

40407cb81de63e76c479ee0b9fa4f114.png

图(1)

726d21546b7ccd1de23855429baec776.png

图(2)

二、使用过程

1、新建TreeNode实体类,对应数据库中的数据

public class TreeNode{

private String id;//本节点id

private String name;//本节点名称

private String parentId;//本节点的父节点

private List children;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getParentId() {

return parentId;

}

public void setParentId(String parentId) {

this.parentId = parentId;

}

public List getChildren() {

return children;

}

public void setChildren(List children) {

this.children = children;

}

}

2、新建TreeUtil类处理list(分别使用两层遍历与递归的方法实现)

public class TreeUtil {

/**

* 两层循环实现建树

* @param treeNodes 传入的树节点列表

* @return

*/

public static List bulid(List treeNodes) {

List trees = new ArrayList();

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.getChildren().add(it);

}

}

}

return trees;

}

/**

* 使用递归方法建树

* @param treeNodes

* @return

*/

public static List buildByRecursive(List treeNodes) {

List trees = new ArrayList();

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 treeNodes) {

treeNode.setChildren(new ArrayList());

for (TreeNode it : treeNodes) {

if(treeNode.getId().equals(it.getParentId())) {

if (treeNode.getChildren() == null) {

treeNode.setChildren(new ArrayList());

}

treeNode.getChildren().add(findChildren(it,treeNodes));

}

}

return treeNode;

}

}

3、将数据库中的数据保存到list数组中,调用TreeUtil中的处理函数

调用递归方法

TreeUtil.buildByRecursive(menuList);

调用两层遍历的方法

TreeUtil.bulid(menuList);

java从数据库读取菜单,递归生成菜单树

首先看一下菜单的样子 根据这个样子我们定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; ...

Java从数据库读取页面树形菜单

从数据库加载菜单及子菜单主要使用递归的方法,具体实现可看代码 首先封装一个菜单pojo public class Menu { // 菜单id private String id; // 菜单名称 p ...

JAVA与数据库MySQL相连接

JDBC(Java数据库连接体系结构): 是Java实现数据库访问的应用程序编程接口,主要功能是管理存放在数据库中的数据.通过接口对象,应用程序可以完成与数据库的连接,执行SQL语句,从数据库中获取结 ...

echarts通过ajax向服务器发送post请求,servlet从数据库读取数据并返回前端

1.echarts的官网上的demo,都是直接写死的随机数据,没有和数据库的交互,所以就自己写了一下,ok,我们开始一步一步走一遍整个流程吧. 就以官网最简单的那个小demo来做修改吧.官网上的小de ...

oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置

oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置 在上一节我们讲述的配置是把授权码存储在redis中,把相应的请求的路径用使用in-memory存储 ,这个是 ...

java和数据库中日期类型的常见用法

(1)java中日期类型:Date.Timestamp(2)数据库中:Date.Timestamp(3)字符串和Date之间的格式化转换:    SimpleDateFormat类方法: format ...

java IO流读取图片供前台显示

最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了 ...

《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

翻译的初衷以及为什么选择来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

AppSettings从数据库读取

/// /// 提供对配置信息的访问 /// public static class AppSettings { ///

随机推荐

TCP/IP详解学习笔记(8)-- UDP:用户数据报协议

1.UDP概述 UDP是一种无连接的, 即发送数据前不需要建立连接,因此减小的开销和发送数据的延迟. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表. UDP是面向报文 ...

我的Jekyll博客

我在GitHub Page上托管的Jekyll博客地址:http://lastavenger.github.io/

plugin

http://wicky.nillia.ms/headroom.js/ http://makotot.github.io/sidebar/ http://www.nodebeginner.org/in ...

BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

Java开发从初级到中级

本人正统软件工程专业毕业,虽然实力垫底,但是大学的时候,整个学校非常热衷于OJ,ACM之类,耳濡目染,自以为基础的知识是有的.但是 一直觉得学的东西都是一团浆糊,按照老师的话说,我是那种看书只看目录, ...

javascript从数组中删除一个元素

Array.prototype.remove = function(val) { var index = this.indexOf(val); if (index > -1) { this.sp ...

Android性能优化之Bitmap的内存优化

1.BitmapFactory解析Bitmap的原理 BitmapFactory提供的解析Bitmap的静态工厂方法有以下五种: Bitmap decodeFile(...) Bitmap decod ...

一步一步理解 python web 框架,才不会从入门到放弃 -- 简单登录页面

上一节,我们基本了解了 Django 的一些配置,这一节,我们将通过一个简单的登录页面,进一步学习 Django 的使用. 新建项目 首先,新建一个 Django 项目,记得别弄错了哦. settin ...

依赖注入&lbrack;2&rsqb;&colon; 基于IoC的设计模式

正如我们在提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC自身不仅与面向对象没有必然的联系,它也算不上是一种设计模式.一般来讲,设计模 ...

javascript的数组之from&lpar;&rpar;

Array.from()方法从一个类似数组或可迭代对象中创建一个新的数组实例. const arr = [1, 2, 3]; Array.from(arr); //[1, 2, 3] Array.fr ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值