这是用于生成树的类,适用于分类号采用的是自增的方式,并且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);
}
}
分享到:
相关推荐
本教程将详细讲解如何利用Structs2框架来生成树形结构,以实现数据的层级展示。这个过程通常涉及到SSH(Struts2、Spring和Hibernate)集成开发环境,这三种技术的结合可以提供一个强大且灵活的后端解决方案。 首先...
总之,通过XML生成目录树是XML处理的关键步骤,它使得我们可以以树形结构来理解和操作XML数据,从而在各种应用场景中实现数据的动态管理。无论是开发Web应用程序、处理配置文件还是构建复杂的数据结构,理解并掌握这...
本文将深入探讨如何使用libxml2库在C语言中实现XML文件的遍历,包括递归和非递归两种算法。 首先,libxml2是一个强大的XML解析库,它提供了丰富的API,使得我们能够方便地处理XML文档。在C语言环境下,libxml2库为...
首先,我们需要定义生成树的函数,然后递归地调用这个函数直到满足终止条件(例如叶子节点只包含同一类别的样本或者没有更多的特征可供选择)。 ```python def createTree(dataSet, labels): classList = [example...
递归方法是从数组的第一个元素开始,每次可以选择包括或不包括当前元素,生成新的子集和。而动态规划则通过构建一个表来记录前i个元素的所有可能子集和,避免了重复计算,提高了效率。 总的来说,"example.zip"中的...
在《机器学习实战》中,构建决策树的核心函数`createTree()`被用来根据给定的数据集和特征标签生成决策树。该函数使用递归的方式实现,主要流程如下: 1. **基本情况判断**: - 如果数据集中所有样本属于同一类别...
Edmonds于1965年提出,是解决图论中寻找最大生成树问题的一种高效方法,特别适用于加权无向图。在数据科学、人工智能和统计领域,这种算法有着广泛的应用,例如在网络优化、机器学习和图论问题求解中。 首先,我们...
例如,通过迭代器可以遍历一个数组中的所有元素,或者通过递归函数来深度搜索对象树。 #### 总结 使用C++处理JSON数据,尤其是借助于像`jsoncpp`这样的强大库,可以让数据的解析和生成变得更加简单高效。无论是...
使用许多代码生成器,尝试使用ember help generate获取更多详细信息 运行测试 ember test ember test --server 建造 ember build (开发) ember build --environment production (生产) 部署 指定部署应用程序...
6. HTML结构:`example01.html`可能是一个包含示例树结构的HTML文件,它会引用`dtree.js`和`dtree.css`来实现功能和样式。HTML中可能有一个容器元素(如`<div id="treeContainer">`)来承载由JavaScript生成的树形...
1. T4模板文件(.tt文件):包含用于生成树结构代码的T4模板。 2. 示例树数据:可能是一个JSON或XML文件,用于在模板中读取和生成代码的输入数据。 3. 输出的代码文件:T4模板执行后的生成结果,包含根据输入数据...
`bison`会根据这些规则生成C++代码,构建一个递归下降解析器。 在编译和链接阶段,`lexertl`生成的词法分析器对象和`bison`生成的语法分析器对象会整合到同一个程序中。运行这个程序时,它会读取输入源代码,先通过...
例如,`data_example1.js`到`data_example6.js`可能包含了不同的树形数据结构,供程序动态生成树形视图。 8. **API.html 和 index.html** `API.html`可能是包含树组件API文档的页面,详细解释如何使用这个组件。而...
2. **遍历XML元素**:通过递归函数遍历XML文档的元素树,构建对应的TreeView节点。对于每个元素,创建一个TreeNode,并设置其文本为元素的文本内容,属性为额外的信息,如`name`或`id`。 ```csharp private void ...
5. **递归渲染**:由于树形数据可能包含任意层级的子节点,组件需要递归地渲染每一层,确保整个树结构的正确展现。 6. **事件处理**:为了与应用的其他部分进行交互,Vttree组件通常会触发各种事件,如`node-click`...
例如,可以使用Perlin噪声函数来生成逼真的随机地形,或者通过递归分形算法创建复杂的树结构。现场高级程序生成的核心在于编写能够根据一组规则或参数自动生成内容的代码。 在"procedural-example-main"这个文件中...
6. **图的优化问题**:图还可以用于解决各种优化问题,如最小生成树(Kruskal's算法或Prim's算法)、拓扑排序和二分图判断等。 【标签】"JavaScript" JavaScript作为这个项目的编程语言,意味着我们将使用其原生...