Java递归将List转为树形结构

文章目录

 

前言

由于在做前端动态路由时,需要将后端的数据转为tree便于前端构造Vue Router


一、开发环境

  • JDK11(使用了forEach代替循环)

二、具体使用

1.思路

使用递归来获取子节点,在递归的过程中将已添加到树结构中的数据剔除,减少递归调用的次数

2.实现

代码下载链接:https://download.csdn.net/download/weixin_38500202/13214868

 Menu内部类定义如下

    @Data
    static class Menu {
        private Integer id;

        /**
         * 父节点Id
         */
        private Integer parentId;

        /**
         * 菜单名
         */
        private String menuName;

        List<Menu> children;
    }

 具体的实现方法如下

    public List<Menu> list2Tree(List<Menu> list, Integer pId) {
        List<Menu> tree = new ArrayList<>();
        Iterator<Menu> it = list.iterator();
        while (it.hasNext()) {
            Menu m = it.next();
            if (m.parentId == pId) {
                tree.add(m);
                // 已添加的元素删除掉
                it.remove();
            }
        }
        // 寻找子元素
        tree.forEach(n -> n.children = list2Tree(list, n.id));
        return tree;
    }

二、结果

输出结果如下所示


三、总结

递归yyds!🐂

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您可以使用递归的方式将List年级、班级和课程转换为树形结构。以下是一个示例的Java代码: ```java import java.util.ArrayList; import java.util.List; class TreeNode { private String name; private List<TreeNode> children; public TreeNode(String name) { this.name = name; this.children = new ArrayList<>(); } public void addChild(TreeNode child) { this.children.add(child); } public String getName() { return name; } public List<TreeNode> getChildren() { return children; } } class Course { private String name; public Course(String name) { this.name = name; } public String getName() { return name; } } public class Main { public static void main(String[] args) { // 创建年级、班级和课程列表 List<String> grades = List.of("Grade 1", "Grade 2"); List<String> classes = List.of("Class A", "Class B"); List<String> courses = List.of("Math", "English", "Science"); // 转换为树形结构 TreeNode root = new TreeNode("Root"); for (String grade : grades) { TreeNode gradeNode = new TreeNode(grade); for (String clazz : classes) { TreeNode classNode = new TreeNode(clazz); for (String course : courses) { TreeNode courseNode = new TreeNode(course); classNode.addChild(courseNode); } gradeNode.addChild(classNode); } root.addChild(gradeNode); } // 打印树形结构 printTree(root, 0); } private static void printTree(TreeNode node, int level) { StringBuilder indent = new StringBuilder(); for (int i = 0; i < level; i++) { indent.append(" "); } System.out.println(indent + node.getName()); for (TreeNode child : node.getChildren()) { printTree(child, level + 1); } } } ``` 在上述代码,我们创建了一个`TreeNode`类来表示的节点,每个节点有一个名称和一个子节点列表。我们还创建了一个`Course`类来表示课程。 在`Main`类的`main`方法,我们使用三个列表来表示年级、班级和课程。然后,我们使用嵌套的循环来将它们转换为树形结构。最后,我们使用递归的方式打印出整个树形结构。 注意:这只是一个示例代码,您可以根据自己的需求进行修改和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值