`
编程足球
  • 浏览: 250783 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Ext 生成树递归算法

    博客分类:
  • Ext
 
阅读更多
最近在生成Ext的树型结构是,要用递归的算法来实现从数据库中读取出对应的json数据结构
在 网上找到一个不错的算法。一起来分享下:

import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
  
  
public class Recursion {  
	StringBuffer returnStr=new StringBuffer();
    List nodeList =new ArrayList();  
//  构造方法里初始化模拟List,添加测试数据
    Recursion()
    {
        Node node1 = new Node(1,0);    
        Node node2 = new Node(2,1);    
        Node node3 = new Node(3,1);    
        Node node4 = new Node(4,2);    
        Node node5 = new Node(5,2);    
        Node node6 = new Node(6,2);    
        Node node7 = new Node(7,6);    
        Node node8 = new Node(8,6);    
            
        nodeList.add(node1);    
        nodeList.add(node2);    
        nodeList.add(node3);    
        nodeList.add(node4);    
        nodeList.add(node5);    
        nodeList.add(node6);    
        nodeList.add(node7);    
        nodeList.add(node8);    
    }  
    
    /**
     * 递归函数
     * @param list 要递归的节点对象集合
     * @param node 要进行递归的节点
     */
    public void recursionFn(List list , Node node){    
        if(hasChild(list,node)){    
            returnStr.append("{id:");  
            returnStr.append(node.getId());  
            returnStr.append(",parentId:");  
            returnStr.append(node.getParentId());  
            returnStr.append(",children:[");    
            List childList = getChildList(list,node);    
            Iterator it = childList.iterator();    
            while(it.hasNext()){    
                Node n = (Node)it.next();    
                recursionFn(list,n);    
            }    
            returnStr.append("]},");    
        }else{    
            returnStr.append("{id:");  
            returnStr.append(node.getId());  
            returnStr.append(",parentId:");  
            returnStr.append(node.getParentId());  
            returnStr.append(",leaf:true},");    
        }    
            
    }    
    
    /**
     * 判断是否有孩子
     * @param list
     * @param node
     * @return
     */
    public boolean hasChild(List list, Node node){  //判断是否有子节点  
        return getChildList(list,node).size()>0?true:false;  
    }  
    
    /**
     * 找去node的所有子节点
     * @param list 进行遍历的节点
     * @param node 要找孩子的节点
     * @return
     */
    public List getChildList(List list , Node node){  //得到子节点列表  
        List li = new ArrayList();    
        Iterator it = list.iterator();    
        while(it.hasNext()){    
            Node n = (Node)it.next();    
            if(n.getParentId()==node.getId()){    
                li.add(n);    
            }    
        }    
        return li;    
    }  
    public String modifyStr(String returnStr){//修饰一下才能满足Extjs的Json格式  
        return ("["+returnStr+"]").replaceAll(",]", "]");  
          
    }  
    public static void main(String[] args) {    
        Recursion r = new Recursion();    
        r.recursionFn(r.nodeList, new Node(1,0));    
        System.out.println(r.modifyStr(r.returnStr.toString()));    
    }    
}  



上面的节点结构为:
package com.ruijie.Test;

public class Node {  
    private int id;  
    private int parentId;  
    Node(){}  
    Node(int id,int parentId){  
        this.id=id;  
        this.parentId = parentId;  
    }  
    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;  
    }  
}  


上面的算法简单。主要就是要有要遍历的节点和一个父节点的集合。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics