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

**********************************************************************************************************************************************************

思路二:

数据库  id,name,parent_id

java对象:

private class TreeNode{
    private String id;
    private String name;
    private String parentId;
    private List<TreeNode> children;
    
    // TODO getter/setter
}

树构造代码如下:

        List<TreeNode> menuList = xxManager.findAllMenu();
        
        List<TreeNode> nodeList = new ArrayList<TreeNode>();
        for(TreeNode node1 : menuList){
            boolean mark = false;
            for(TreeNode node2 : menuList){
                if(node1.getParentId()!=null && node1.getParentId().equals(node2.getId())){
                    mark = true;
                    if(node2.getChildren() == null)
                        node2.setChildren(new ArrayList<TreeNode>());
                    node2.getChildren().add(node1); 
                    break;
                }
            }
            if(!mark){
                nodeList.add(node1); 
            }
        }
        //转为json格式        
        String json = JSONArray.fromObject(nodeList).toString();
        System.out.println("json:"+json);

原理如下图了:

转载于:https://www.cnblogs.com/cjt-java/p/3826288.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值