通过循环方式将list转换成树

6 篇文章 0 订阅
4 篇文章 0 订阅

生成系统目录

之前是先获取到整体的集合对象,然后使用递归的方式将信息进行整合。
新方式,学习一下
		/// <summary>
        /// 转换成树
        /// </summary>
        public List<ProjectMenuViewModel> ToTree(List<ProjectMenuViewModel> source)
        {
            if (source == null)
            {
                return new List<ProjectMenuViewModel>();
            }

            //缺失父节点数据时,提升为一级节点
            foreach (var node in source)
            {
                if (node.UpId > 0)
                {
                    if (!source.Any(n => n.MenuId == node.UpId))
                    {
                        node.UpId = 0;
                    }
                }
            }

            source = source.OrderBy(m => m.Order).ThenBy(m => m.Id).ToList();

            //所有父节点
            var currentLevel = source.Where(q => q.UpId == 0).ToList();

            while (true)
            {
                //设置当前层子级
                foreach (var temp in currentLevel)
                {
                    temp.Children = source.Where(q => q.UpId == temp.MenuId).ToList();
                }

                //取当前层所有子级,没有表示树完成,退出。
                currentLevel = currentLevel.SelectMany(q => q.Children).ToList();
                if (currentLevel.Count == 0)
                {
                    break;
                }
            }

            return source.Where(q => q.UpId == 0).ToList();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
List数据转换成形结构的基本思路是首先遍历List,将其中每个节点的父子关系建立起来,然后从根节点开始递归构建整个形结构。 具体实现步骤如下: 1. 定义节点类,包含节点id、节点名称和子节点列表等属性。 ``` public class TreeNode { private String id; private String name; private List<TreeNode> children; // getter和setter方法 // ... } ``` 2. 遍历List,将每个节点的父子关系建立起来,可以使用Map来存储节点id和对应的节点对象,便于查找父节点。 ``` Map<String, TreeNode> map = new HashMap<>(); for (TreeNode node : list) { map.put(node.getId(), node); String parentId = node.getParentId(); if (parentId != null) { TreeNode parent = map.get(parentId); if (parent != null) { parent.getChildren().add(node); } } } ``` 3. 找到根节点,开始递归构建整个形结构。 ``` public static TreeNode buildTree(List<TreeNode> list) { // 构建Map,方便查找节点 Map<String, TreeNode> map = new HashMap<>(); for (TreeNode node : list) { map.put(node.getId(), node); } // 找到根节点 TreeNode root = null; for (TreeNode node : list) { if (node.getParentId() == null) { root = node; break; } } // 从根节点开始递归构建整个形结构 buildSubTree(root, map); return root; } private static void buildSubTree(TreeNode node, Map<String, TreeNode> map) { List<TreeNode> children = node.getChildren(); if (children == null) { return; } // 遍历子节点,递归构建子 for (TreeNode child : children) { buildSubTree(child, map); } // 根据子节点的顺序重新排序 children.sort(Comparator.comparing(TreeNode::getName)); } ``` 以上就是将List数据转换成行结构的基本实现方法。需要注意的是,这里的代码只是一个简单的示例,实际情况下可能需要根据具体的业务需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值