不用递归实现生成树的Example

这是用于生成树的类,适用于分类号采用的是自增的方式,并且List中的元素是按从小到大的顺序进行过排序的(这个在查询时很容易实现,加上order by [id] 即可)。
这样只需要进行一次数据库查询操作,如果用递归会查询N多次。


package com.zhenjw.tree;

import java.util.List;
import java.util.Vector;

public class Tree {

public static List createTree(List<TreeNode> all) {

if (all == null || all.size() == 0)
return null;

int count = all.size();
TreeNode bi = new TreeNode();
TreeNode bj = new TreeNode();

//先组织好父子之间的关系然后 填充layer与parentname这两个字段的内容

//1、组织好父子之间的关系
for (int i = 0; i < count; i++) {
bi = (TreeNode) all.get(i);
bi.setLayer(0);
bi.setFullName(bi.getName());
boolean trans = false;
for (int j = i + 1; j < count; j++) {
bj = (TreeNode) all.get(j);
if (bi.getParentNo() == bj.getNo()) {
//是父子关系
all.set(i, bj);
all.set(j, bi); //父在前面子在后面
trans = true;
}
}
if (trans)
i--;
}

//2、组织各个元素所在的层以及全称
for (int i = 0; i < count; i++) {
bi = (TreeNode) all.get(i);
for (int j = i + 1; j < count; j++) {
bj = (TreeNode) all.get(j);
if (bj.getParentNo() == bi.getNo()) {
bj.setLayer(bi.getLayer() + 1);
bj.setFullName(bi.getFullName() + ">>" + bj.getName());
}
}
}

return all;
}

public static List createTree(List all, int topid) {
all = createTree(all);
int count = all.size();
TreeNode bj = new TreeNode();

//把不在这一顶层的其它项都删除掉
int topidj = 0;
int topidlayer = 0;

//查找ID=topid所在的位置
for (int j = 0; j < count; j++) {
bj = (TreeNode) all.get(j);
//找到TopID对应的对象
if (bj.getNo() == topid) {
topidj = j;
topidlayer = bj.getLayer();
break;
}
}
List reslut = new Vector();
for (int j = topidj; j < count; j++) {
bj = (TreeNode) all.get(j);
//找到TopID对应的对象
if (bj.getLayer() <= topidlayer && j > topidj) {
break;
} else {
bj.setLayer(bj.getLayer() - topidlayer);
reslut.add(bj);
}
}
return reslut;
}

}


package com.zhenjw.tree;

import org.apache.commons.lang.builder.ToStringBuilder;

public class TreeNode<T> {

private long no;

private long parentNo;

private String name;

private String fullName;

private int layer;

//用于保存原始的对象,方便在列表时得到对象的其它的信息
private T entity;

public T getEntity() {
return entity;
}

public void setEntity(T entity) {
this.entity = entity;
}

public String getFullName() {
return fullName;
}

public void setFullName(String fullName) {
this.fullName = fullName;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public long getNo() {
return no;
}

public void setNo(long no) {
this.no = no;
}

public long getParentNo() {
return parentNo;
}

public void setParentNo(long parentNo) {
this.parentNo = parentNo;
}

public TreeNode(long no, long parentNo, String name, String fullName, int layer, T entity) {
super();
this.no = no;
this.parentNo = parentNo;
this.name = name;
this.fullName = fullName;
this.layer = layer;
this.entity = entity;
}



public TreeNode(long no, long parentNo, String name, T entity) {
super();
this.no = no;
this.parentNo = parentNo;
this.name = name;
this.entity = entity;
}

public TreeNode() {
super();
// TODO Auto-generated constructor stub
}

public int getLayer() {
return layer;
}

public void setLayer(int layer) {
this.layer = layer;
}

public String toString() {

return ToStringBuilder.reflectionToString(this);

}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值