快速构建树形结构数据(非递归)
通过平铺的原始树形结构数据,快熟构建节点的父子管理,完成树型结构数据的构建,一般在配合前段树形机构显示中有特殊需求的情况中使用。如果需要提出一个父子结构数据中部分数据,如果利用hibernate的级联查询,是很方面获取树形结构的全量,但要剔除部分数据就麻烦了,而且hinernate执行的时候是多个SQL,效率也差一些(不考虑缓存哈)。
原始数据结构:
ID,PID,NAME....
目标数据(json):
{
id:1
name:'NAME1',
children:[
{id:2,name:'name2',children:[...]}
]
}
好了,直接上代码先。
- /**
 - * 快速构建树结构
 - *
 - * 非递归,使用2次循环完成构建。
 - * @author zhangpu
 - *
 - */
 - public class QuickTreeBuilder {
 - public static void main(String[] args) {
 - // 构建原始数据:这里为了简便,原始数据集合使用的也是Node对象,
 - // 实际情况可以是其他任意entity,只需要在后面构建树时进行转化就OK
 - List<Node> orginals = new ArrayList<Node>();
 - // parentId = 0 表示顶层,你也可以构建原始数据parentId=null是顶层,由你决定。
 - for (int i = 1; i <= 5; i++) {
 - orginals.add(new Node(i, i - 1, "name" + i));
 - }
 - // 构建一个Map,把所有原始数据的ID作为Key,原始数据对象作为VALUE
 - Map<Integer, Node> dtoMap = new HashMap<Integer, Node>();
 - for (Node node : orginals) {
 - // 如果原始数据对象不是Node,这里就可以直接写个conver转化
 - // 原始数据对象为Node,放入dtoMap中。
 - dtoMap.put(node.getId(), node);
 - }
 - List<Node> result = new ArrayList<Node>();
 - for (Map.Entry<Integer, Node> entry : dtoMap.entrySet()) {
 - Node node = entry.getValue();
 - if (node.getParentId() == 0) {
 - // 如果是顶层节点,直接添加到结果集合中
 - result.add(node);
 - } else {
 - // 如果不是顶层节点,找的起父节点,然后添加到父节点的子节点中
 - if (dtoMap.get(node.getParentId()) != null) {
 - dtoMap.get(node.getParentId()).addChild(node);
 - }
 - }
 - }
 - // 如果有排序需求,可以在最后对输出的结构进行排序
 - // 打印结果数据
 - System.out.println(result);
 - }
 - static class Node {
 - private int id;
 - private int parentId;
 - private String name;
 - private List<Node> children = new ArrayList<Node>();
 - public Node() {
 - }
 - public Node(int id, int parentId, String name) {
 - super();
 - this.id = id;
 - this.parentId = parentId;
 - this.name = name;
 - }
 - public void addChild(Node node) {
 - this.children.add(node);
 - }
 - public int getId() {
 - return id;
 - }
 - public void setId(int id) {
 - this.id = id;
 - }
 - public int getParentId() {
 - return parentId;
 - }
 - public void setParentId(int parentId) {
 - this.parentId = parentId;
 - }
 - public String getName() {
 - return name;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public List<QuickTreeBuilder.Node> getChildren() {
 - return children;
 - }
 - public void setChildren(List<QuickTreeBuilder.Node> children) {
 - this.children = children;
 - }
 - @Override
 - public String toString() {
 - return "{id:" + id + ", parentId:" + parentId + ", name:" + name + ", children:" + children + "}";
 - }
 - }
 - }
 
                    
                
                
            
        
浙公网安备 33010602011771号