递归封装树形结构

新建数据库表

-- Create table
create table TREENODE
(
  id   VARCHAR2(32),
  text VARCHAR2(128),
  pid  VARCHAR2(32),
  lv   VARCHAR2(32)
);
-- Add comments to the columns 
comment on column TREENODE.id
  is 'ID';
comment on column TREENODE.text
  is '名称';
comment on column TREENODE.pid
  is '父ID';
comment on column TREENODE.lv
  is '层级';
 

 插入测试数据

插入根节点数据

insert into treenode (ID, TEXT, PID, LV) values ('01', '总部', '-1', '1');

--  总部下插入70个二级单位
declare 
  begin 
   for c in (select id as id from treenode where LV = '1') loop 
       for i in 10 .. 80 loop
      insert into treenode values (c.id || i,'二级单位' || c.id || i ,c.id,'2');
      end loop;
  end loop;
 end;

-- 每个二级单位下插入10个三级单位
declare 
  begin 
   for c in (select id as id from treenode where LV = '2') loop 
       for i in 10 .. 20 loop
      insert into treenode values (c.id || i,'三级单位' || c.id || i ,c.id,'3');
      end loop;
  end loop;
 end;

--每个三级单位下插入5个四级单位
declare 
  begin 
   for c in (select id as id from treenode where LV = '3') loop 
       for i in 10 .. 15 loop
      insert into treenode values (c.id || i,'四级单位' || c.id || i ,c.id,'4');
      end loop;
  end loop;
end;

新建实体类

public class TreeNode {
    private String id;

    private String text;

    private String pid;
    
    private List<TreeNode> children; 
    
    private String state;

    .....

}

递归封装数据

//bid 为根节点ID

public List<TreeNode> getStartJson(String bid){
        List<TreeNode> queryList = treeNodeMapper.queryJsonTreeALL();
        ArrayList<TreeNode> parentList = new ArrayList<TreeNode>();
        TreeNode node =null;
        for (TreeNode treeNode : queryList) {
            if(treeNode.getId().equals(bid)){
                node = new TreeNode();
                node.setId(treeNode.getId());
                node.setText(treeNode.getText());
                node.setState("closed");
                parentList.add(treeNode);
                break;
            }
        }
        getChildren(parentList,queryList);
        return parentList;
    } 

private static void getChildren(List<TreeNode> parentList,List<TreeNode> allList) {
        for (TreeNode node : parentList) {
            ArrayList<TreeNode> childrenList = new ArrayList<TreeNode>();
            TreeNode treenode =null;
            for (TreeNode allNode : allList) {
                if(allNode.getPid().equals(node.getId())){
                    treenode = new TreeNode();
                    treenode.setId(allNode.getId());
                    treenode.setText(allNode.getText());
                    treenode.setState("closed");
                    childrenList.add(treenode);
                }
            }
            if(!CollectionUtils.isEmpty(childrenList)){
                node.setChildren(childrenList);
                getChildren(childrenList,allList);
            }
        }
    } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,可以使用递归算法来快速封装树形结构数据。以下是一个示例代码,展示如何使用递归算法来封装树形结构数据: ```java public class TreeUtils { /** * 将数据列表封装树形结构 * @param dataList 数据列表 * @param <T> 数据类型 * @return 树形结构 */ public static <T extends TreeNode> List<T> buildTree(List<T> dataList) { List<T> treeList = new ArrayList<>(); // 构建根节点 for (T node : dataList) { if (node.getParentId() == null || node.getParentId().equals("")) { treeList.add(node); } } // 构建子节点 for (T node : treeList) { buildChildren(node, dataList); } return treeList; } /** * 递归构建子节点 * @param parentNode 父节点 * @param dataList 数据列表 * @param <T> 数据类型 */ private static <T extends TreeNode> void buildChildren(T parentNode, List<T> dataList) { for (T node : dataList) { if (node.getParentId() != null && node.getParentId().equals(parentNode.getId())) { parentNode.addChild(node); buildChildren(node, dataList); } } } } ``` 在上面的示例代码中,buildTree() 方法用于将数据列表封装树形结构,buildChildren() 方法用于递归构建子节点。在构建树形结构时,首先需要找到根节点,然后递归构建子节点。对于每个节点,可以通过 addChild() 方法将其添加到父节点的 children 列表中。 使用上述代码,可以快速地封装树形结构数据,并且可以方便地遍历和操作树形结构数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值