很多人都遇到过树形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; }