通过Java构建树形结构

在这里插入图片描述

通过Java构建树形结构所需要的数据

实体类Test

	/** 主键 */
    private String id;

    /** 父类ID */
    private String parentId;
    
    // 子节点
	private List<Test> children;

    /** 名称 */
    private String name;

buildTreeByStream入参为list
我这里当节点的parentId = ‘-1’ 那么这个节点就是根节点

	// list 是从数据库请求回来的数据
	@Override
    public List<Test> selectTestList(Test test)
    {
    	List<Test> list = TestMapper.selectList(test);
    	// 返回树结构
        return buildTreeByStream(list);
    }
// 构建前端所需要树
    public static List<Test> buildTreeByStream(List<Test> list){
        // 获取根节点
        List<Test> root = list.stream().filter(item -> "-1".equals(item.getParentId())).collect(Collectors.toList());
        // 根据pid 进行分组
        Map<String,List<Test>> map = list.stream().collect(Collectors.groupingBy(Test::getParentId));
        //recursionFnTree(list,map);
        recursionFnTree(root,map);
        return root;
    }
    // 递归
    public static void recursionFnTree(List<Test> list, Map<String,List<Test>> map){
        for (Test test: list) {
            List<Test> childList = map.get(Test.getId());
            test.setChildren(childList);
            if (null != childList && 0<childList.size()){
                recursionFnTree(childList,map);
            }
        }
    }

使用sql查询树形结构 (以若依的部门表为例,主要用于查该部门与子部门)

WITH RECURSIVE cte AS (
SELECT dept_id,parent_id,dept_name FROM `sys_dept` WHERE dept_id = '100' # 参数
UNION ALL 
SELECT aa.dept_id,aa.parent_id,aa.dept_name FROM sys_dept aa,cte WHERE aa.parent_id = cte.dept_id
)
SELECT * FROM cte;




  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
构建树形结构,你可以使用Java中的树形数据结构,如树或二叉树。你可以将数据存储在节点中,然后使用递归方法来构建树形结构。 下面是一个简单的示例代码,用于构建一个二叉树并统计汇总: ```java class Node { int value; Node left; Node right; Node(int value) { this.value = value; left = null; right = null; } } class BinaryTree { Node root; BinaryTree() { root = null; } // 添加节点 void insert(int value) { root = insert(root, value); } Node insert(Node node, int value) { if (node == null) { node = new Node(value); return node; } if (value < node.value) { node.left = insert(node.left, value); } else if (value > node.value) { node.right = insert(node.right, value); } return node; } // 统计汇总 int sum(Node node) { if (node == null) { return 0; } return node.value + sum(node.left) + sum(node.right); } } public class TreeDemo { public static void main(String[] args) { BinaryTree tree = new BinaryTree(); // 添加节点 tree.insert(5); tree.insert(3); tree.insert(7); tree.insert(1); tree.insert(9); // 统计汇总 int total = tree.sum(tree.root); System.out.println("Total: " + total); } } ``` 在这个示例中,我们首先定义了一个`Node`类来表示树的节点,然后定义了一个`BinaryTree`类来表示二叉树,并提供了一个`insert`方法来添加节点。最后我们提供了一个`sum`方法来统计汇总,使用递归方法遍历整个树来计算节点值的总和。 在`main`方法中,我们创建了一个二叉树并添加了一些节点,最后调用`sum`方法来计算节点值的总和。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值