使用递归算法结合数据库解析成Java树形结构的代码解析

 更新时间:2017年09月04日 11:08:45   作者:Ruthless  
这篇文章主要介绍了使用递归算法结合数据库解析成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_tree (CID, CNAME, PID) values (3, '广东省', 1);
insert into tb_tree (CID, CNAME, PID) values (4, '上海市', 1);
insert into tb_tree (CID, CNAME, PID) values (5, '广州市', 3);
insert into tb_tree (CID, CNAME, PID) values (6, '深圳市', 3);
insert into tb_tree (CID, CNAME, PID) values (7, '海珠区', 5);
insert into tb_tree (CID, CNAME, PID) values (8, '天河区', 5);
insert into tb_tree (CID, CNAME, PID) values (9, '福田区', 6);
insert into tb_tree (CID, CNAME, PID) values (10, '南山区', 6);
insert into tb_tree (CID, CNAME, PID) values (11, '密云县', 2);
insert into tb_tree (CID, CNAME, PID) values (12, '浦东', 4);

2、TreeNode对象,对应tb_tree

public class TreeNode implements Serializable {
private Integer cid;
private String cname;
private Integer pid;
private List nodes = new ArrayList();
public TreeNode() {
}
//getter、setter省略
}

3、测试数据

public class TreeNodeTest {
@Test
public void loadTree() throws Exception{
System.out.println(JsonUtils.javaToJson(recursiveTree(1)));
}
/**
* 递归算法解析成树形结构
*
* @param cid
* @return
* @author jiqinlin
*/
public TreeNode recursiveTree(int cid) {
//根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?)
TreeNode node = personService.getreeNode(cid);
//查询cid下的所有子节点(SELECT * FROM tb_tree t WHERE t.pid=?)
List childTreeNodes = personService.queryTreeNode(cid); 
//遍历子节点
for(TreeNode child : childTreeNodes){
TreeNode n = recursiveTree(child.getCid()); //递归
node.getNodes().add(n);
}
return node;
}
}

输出的json格式如下:

{
  "cid": 1,
  "nodes": [
    {
      "cid": 2,
      "nodes": [
        {
          "cid": 11,
          "nodes": [
          ],
          "cname": "密云县",
          "pid": 2
        }
      ],
      "cname": "北京市",
      "pid": 1
    },
    {
      "cid": 3,
      "nodes": [
        {
          "cid": 5,
          "nodes": [
            {
              "cid": 7,
              "nodes": [
              ],
              "cname": "海珠区",
              "pid": 5
            },
            {
              "cid": 8,
              "nodes": [
              ],
              "cname": "天河区",
              "pid": 5
            }
          ],
          "cname": "广州市",
          "pid": 3
        },
        {
          "cid": 6,
          "nodes": [
            {
              "cid": 9,
              "nodes": [
              ],
              "cname": "福田区",
              "pid": 6
            },
            {
              "cid": 10,
              "nodes": [
              ],
              "cname": "南山区",
              "pid": 6
            }
          ],
          "cname": "深圳市",
          "pid": 3
        }
      ],
      "cname": "广东省",
      "pid": 1
    },
    {
      "cid": 4,
      "nodes": [
        {
          "cid": 12,
          "nodes": [
          ],
          "cname": "浦东",
          "pid": 4
        }
      ],
      "cname": "上海市",
      "pid": 1
    }
  ],
  "cname": "中国",
  "pid": 0
}

总结

以上所述是小编给大家介绍的使用递归算法结合数据库解析成Java树形结构的代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 在java中获取List集合中最大的日期时间操作

    在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Tk.mybatis零sql语句实现动态sql查询的方法(4种)

    Tk.mybatis零sql语句实现动态sql查询的方法(4种)

    有时候,查询数据需要根据条件使用动态查询,这时候需要使用动态sql,本文主要介绍了Tk.mybatis零sql语句实现动态sql查询的方法,感兴趣的可以了解一下
    2021-12-12
  • 解决SpringCloud Gateway采用OpenFeign远程调用失败的问题

    解决SpringCloud Gateway采用OpenFeign远程调用失败的问题

    在使用SpringCloud网关进行统一鉴权和认证过程中,通过OpenFeign远程调用鉴权服务器接口时可能会遇到远程调用失败的问题,这通常是因为HttpMessageConverters没有被正确注入到Spring容器中
    2024-09-09
  • Nacos单机版安装启动的全流程

    Nacos单机版安装启动的全流程

    这篇文章主要介绍了Nacos单机版安装启动的全流程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java中的main方法调用非静态方法处理

    Java中的main方法调用非静态方法处理

    这篇文章主要介绍了Java中的main方法调用非静态方法处理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java集合之同步容器详解

    Java集合之同步容器详解

    这篇文章主要为大家详细介绍了Java集合之同步容器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Redisson分布式信号量RSemaphore的使用超详细讲解

    Redisson分布式信号量RSemaphore的使用超详细讲解

    这篇文章主要介绍了Redisson分布式信号量RSemaphore的使用,基于Redis的Redisson的分布式信号量RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法
    2023-02-02
  • java如何获取本机IP地址

    java如何获取本机IP地址

    这篇文章主要为大家详细介绍了java如何获取本机IP地址,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • mybatis Invalid bound statement(not found)排坑记录

    mybatis Invalid bound statement(not foun

    这篇文章主要介绍了mybatis Invalid bound statement(not found)排坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Springboot中的默认日志框架配置详解

    Springboot中的默认日志框架配置详解

    这篇文章主要介绍了Springboot中的默认日志框架配置详解,spring boot日志默认会输出到控制台,所以并不需要我们做过多配置,但不过不喜欢控制台默认日志格式,则可以使用logging.pattern.console属性配置,需要的朋友可以参考下
    2023-09-09

最新评论