Java递归将List数据转换为Tree结构数据

因为在开发过程中遇到一个树控件(被公司大佬封装过的)只能解析树形结构数据,所以我只能将sql查到的列表结构数据转换为树形结构数据。首先想到就是百度,结果百度半天没百度着合适的,那就自己写一个吧。

下面事例的都是伪数据和伪代码,都是假的啊。。。就是提供一个递归的思路咯~

转换前数据原型:

[{
	'id': 1,
	'pid': -1,
	'name': 'lala01'
}, {
	'id': 2,
	'pid': -1,
	'name': 'lala02'
}, {
	'id': 3,
	'pid': 1,
	'name': 'lala03'
}, {
	'id': 4,
	'pid': 3,
	'name': 'lala04'
}, {
	'id': 5,
	'pid': 2,
	'name': 'lala05'
}]

期待的转换结果:

[{
	'id': 1,
	'pid': -1,
	'name': 'lala01',
	'children': [{
		'id': 3,
		'pid': 1,
		'name': 'lala03',
		'children': [{
			'id': 4,
			'pid': 3,
			'name': 'lala04',
			'children': []
		}]
	}]
}, {
	'id': 2,
	'pid': -1,
	'name': 'lala02',
	'children': [{
		'id': 5,
		'pid': 2,
		'name': 'lala05',
		'children': []
	}]
}]

java伪代码:

    /**
     * 使用递归方法建树
     *
     * @param treeNodes
     * @return
     */
    private static List<TreeNode> rebuildList2Tree(List<TreeNode> treeNodes) {
        boolean existRootNode = false;
        List<TreeNode> newTree = new ArrayList<TreeNode>();//初始化一个新的列表
        for (TreeNode treeNode : treeNodes) {
            if (isRootNode(treeNode, treeNodes)) {//选择根节点数据开始找儿子
                newTree.add(findChildren(treeNode, treeNodes));
                existRootNode = true;
            }
        }
        if(!existRootNode){//也可能大家都是根节点
            return treeNodes;
        }
        return newTree;
    }

    /**
     * 判断节点是否是根节点
     * @param checkNode
     * @param treeNodes
     * @return
     */
    private static boolean isRootNode(TreeNode checkNode, List<TreeNode> treeNodes) {
        for (TreeNode treeNode : treeNodes) {
            if (checkNode.getParentId().equals(treeNode.getId())) {//判断checkNode是不是有爸爸
                return  false;
            }
        }
        return true;
    }


    /**
     * 递归查找子节点
     *
     * @param treeNodes
     * @return
     */
    private static TreeNode findChildren(TreeNode parentNode, List<TreeNode> treeNodes) {
        List<TreeNode> children = parentNode.getChildren();
        for (TreeNode it : treeNodes) {
            if (parentNode.getId().equals(it.getParentId())) {//找儿子,判断parentNode是不是有儿子
                children.add(findChildren(it, treeNodes));
            }
        }
        return parentNode;
    }

再次强调啊!以上的都是伪数据和伪代码,方法可能无法直接使用到你的项目中,还是需要你自己看下,捋一捋思路的。祝你好运吧~~~

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值