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;
}
}


上面的算法简单。主要就是要有要遍历的节点和一个父节点的集合。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值