很多人都遇到过树形json字符串问题。
转树形json我第一反应想到的就是用递归。可是递归速度很慢。
下面是递归的写法:
roots:是最终返回的树形list,直接转换成json就行了。list:是普通的list,需要转成树形的list。
public static void getTree(String parentId,List<TreeEntity> list,List<TreeEntity> roots){
for(TreeEntity node:list){
if(node.getParentId().equals(parentId)){
roots.add(node);
getTree(node.getId(),list,node.getChilds());
}
}
}
上面的代码:12个节点要遍历100-200 甚至更多此,时间也很慢,因为是递归+for遍历。
后来想roots.add(node);add一次就在list中把该元素去掉,结果发现递归中在使用这个list,无法删除,用迭代器也不能删除,很是无解
下面是非递归写法:
list:是普通的list,需要转成树形的list。
root:是根节点id,也可以为空
返回值就是树形的list了
我自己测试3000条数据需要3毫秒,而上面的递归需要60毫秒。
不知哪位大神有递归方式的快速写法,请告知
public static List<TreeEntity> initTreeNodeList(List<TreeEntity> list,String root){
if(list.size() <= 0){
return null;
}
Map<String,TreeEntity> map = getTreeMap(list,root);
if(map.size() == 0){
return null;
}
List<TreeEntity> roots = new ArrayList<TreeEntity>();
Iterator<TreeEntity> iter = map.values().iterator();
TreeEntity treeNode = null;
while(iter.hasNext()){
treeNode = iter.next();
if(treeNode.getParentId() == null || treeNode.getParentId() == ""||treeNode.getParentId().equals(root)){
roots.add(treeNode);
}
}
return roots;
}
private static Map<String,TreeEntity> getTreeMap(List<? extends TreeEntity > list,String root){
Map<String,TreeEntity> map = new HashMap<String, TreeEntity>();
for(TreeEntity node:list) {
map.put(node.getId(),node);
}
Iterator<TreeEntity> iter = map.values().iterator();
while(iter.hasNext()){
TreeEntity node = iter.next();
if(node.getParentId() == null || node.getParentId() == ""||node.getParentId().equals(root)){
continue;
}
TreeEntity parentNode = map.get(node.getParentId());
if(parentNode != null){
node.setParent(parentNode);
parentNode.getChilds().add(node);
}
}
return map;
}