数据库树型结构查询(MySQL)

转载请注明:http://user.qzone.qq.com/97039144/blog/1416059888
1.建表语句: create table tree( id int , name varchar(255),parent_id int);

2.要展现树型的话,上面的数据结构需要程序来做转换,下面给出程序,可支持N层结构的树型。

3.TreeBuilder.java

public class TreeBuilder{
    /**
       算法思想是: 使用map 作id 与记录的映射,
       第一步把root节点找出并标记为删除;
       第二步遍历记录列表取出每个的父id,然后到映射里找到相应的记录parent,把当前记录作为parent的children;
       第三步把收集器里的记录转换成list。
        
        注意:这里使用了Map 数据结构 与  java 的 引用特性;虽然map 与 picking 是两次遍历 records,但里面相同的key的记录引用 是
        指向相同的内存的。
    **/
    public List builder(List records){
        
//映射id与记录成为  {id : record}
        Map<String,Map> map = new HashMap<String,Map>();
        for(Map su : records){
            map.put(MapUtils.getString(su, "id"), su);
        }
        //收集
    Map<String,Map> picking = new HashMap<String,Map>();
    for(Map su : records){
        String parentId = MapUtils.getString(su, "parent_id");
        boolean removed =  MapUtils.getBoolean(su, "removed",false);
        if("0" .equals(parentId)  && !removed){//父id为0,此时为root
            picking.put(MapUtils.getString(su, "id"), su);
            su.put("removed", true);//标记为删除,不可真删除,否则会报currencyXXXX的异常
        }
    }
    //构建树
    for(Map su : records){
        String parentId = MapUtils.getString(su, "parent_id");
        boolean removed =  MapUtils.getBoolean(su, "removed",false);
        if(!"0" .equals(parentId) && !removed){
            Map parent = map.get(parentId);//取出映射中的记录
            if( parent.containsKey("children") ){//是否有子节点,有把当前记录作为子节点
                List<Map> children = (List<Map>)parent.get("children");
                children.add(su);
            }else{//无,则添加子节点容器,再把当前记录作为子节点
                List<Map> children = new ArrayList<Map>();
                children.add(su);
                parent.put("children", children);
            }
        //标记为删除,不可真删除,否则会报currencyXXXX的异常
        su.put("removed", true);
        }
}
    //转为list
    List<Map> result = new ArrayList();
    Set<String> keySet = picking.keySet();
    for(String key : keySet){
    Map resultItem = map.get(key);
    result.add(map.get(key));
    }
    return result;
    }
}


转载于:https://my.oschina.net/zhanggf1988/blog/345145

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值