mysql数据库创建树结构,数据库树型结构查询(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 map = new HashMap();

for(Map su : records){

map.put(MapUtils.getString(su, "id"), su);

}

//收集

Map picking = new HashMap();

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 children = (List)parent.get("children");

children.add(su);

}else{//无,则添加子节点容器,再把当前记录作为子节点

List children = new ArrayList();

children.add(su);

parent.put("children", children);

}

//标记为删除,不可真删除,否则会报currencyXXXX的异常

su.put("removed", true);

}

}

//转为list

List result = new ArrayList();

Set keySet = picking.keySet();

for(String key : keySet){

Map resultItem = map.get(key);

result.add(map.get(key));

}

return result;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值