java list 转 树形json 递归效率对比


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

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值