转载请注明: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;
}
}