因为在开发过程中遇到一个树控件(被公司大佬封装过的)只能解析树形结构数据,所以我只能将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;
}
再次强调啊!以上的都是伪数据和伪代码,方法可能无法直接使用到你的项目中,还是需要你自己看下,捋一捋思路的。祝你好运吧~~~