解析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 children;
    
    // TODO getter/setter
}

树构造代码如下:

        List menuList = xxManager.findAllMenu();
        
        List nodeList = new ArrayList();
        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());
                    node2.getChildren().add(node1); 
                    break;
                }
            }
            if(!mark){
                nodeList.add(node1); 
            }
        }
        //转为json格式        
        String json = JSONArray.fromObject(nodeList).toString();
        System.out.println("json:"+json);

原理如下图了:

解析java树形结构_第1张图片

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

你可能感兴趣的:(解析java树形结构)