解析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);

原理如下图了:

解析java树形结构,布布扣,bubuko.com

时间: 2024-12-14 08:16:04

解析java树形结构的相关文章

递归算法解析成树形结构

/** * 递归算法解析成树形结构 * * @param cid * @return * @author jiqinlin */ public TreeNodeModel recursiveTree(int org_code) { //根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?) MiddleOrgEntity middleOrgEntity = new MiddleOrgEntity(); middleOrgEntity.setTable

个人常用工具类:JAVA树形结构工具类02

JAVA树形结构工具类02 TreeNode import java.util.ArrayList; import java.util.List; /** * Created by Ace on 2017/6/12. */ public class TreeNode { protected int id; protected int parentId; List<TreeNode> children = new ArrayList<TreeNode>(); public List&

个人常用工具类:JAVA树形结构工具类01

JAVA树形结构工具类 BaseTreeObj.java /** * 基层树形结构实体类 * 必备属性:id,parentId,childsList */ @Data public class BaseTreeObj implements Serializable { private static final long serialVersionUID = 1L; private String id; private String parentId; private String name; p

java 树形结构工具类

   好久就想写博客了,苦苦因为没时间...没关系.从现在开始,每天我都会努力抽出点时间来进行做一次总结.把我认为在项目需求中认为很有用的东西,展示给大家,希望大家一起学习,一起进步.第一次做总结,写的不好的,提出来一起学习,谢谢.    分析:   在业务需求总,我们总会碰到一些业务.比如:对上下级的用户关系进行遍历,对资源权限进行遍历...等等.这些业务非常常见.在同一个项目中,他的代码遍历都是类似的,为了更高效的复用代码,我们有必要进行深成次的封转.下面是我花了一点时间进行封装,有需要直接

MyEclipse建立树形结构包

温馨提示:本文是一个java菜鸟对其他新手朋友在新建java包时所遇问题的解释,高手请绕道哦~~~~ 随便一个java项目中免不了有多层嵌套的包: 对一个过了计算机一级的孩子来说,建立如上几个嵌套的树状java包肯定都不在话下吧? 说来可笑,昨天晚上,在MyEclipse中建立这几个包浪费了老子半个小时! 别笑我!我相信不少人当初用的时间比我还多!哈哈~~开个玩笑~~ 以本文开头那个项目的包结构为例,我的思路是,①先建立顶层包com,②再在com包下建立第二层包jypt,③再在jypt包下面建立

Java创建树形结构算法实例

在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBean 1 2 3 import java.io.Serializable; 4 import java.util.ArrayList; 5 import java.util.Collections; 6 import java.util.Comparator; 7 import java.util.

java 把DataTable数据类型转换为树形结构(多叉树)

问题分析:一个关系数据库的表,如图所示: 可以看到后面四个字段:Country,Province,City,Street 具有逻辑上的从属结构,现在要把这种数据搞成一个树形结构,如图所示: 不是原来的数据转换而成的,大致就是这个意思,可以想象成,dataTable里面相同的数据进行单元格合并,然后找到所有的从根到叶子节点的路径,就算完成任务.JS里面似乎有很多插件可以实现,但Java中我暂时还没找到,没办法只能自己写了.从结构上看,应该是一个多叉多级树形结构,所以在转换的时候必须具备一定的灵活性

java 实现树形结构

package tree; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTr

Silverlight项目笔记7:xml/json数据解析、MVVM下实现多级树形结构TreeView、忽视引用类型导致数据绑定错误、通过流或动态空间加载图片、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

涉及的内容主要有: 1.xml/json数据解析 2.多级树形结构TreeView 3.忽视引用类型导致数据绑定错误 4.通过流或动态空间加载图片 5.虚拟目录设置 6.silverlight安全机制引发的问题 7.webclient缓存问题 1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应节点的数据集合,再通过Element这个方法对数据集合进