接着上面的一往篇,继续说树型结构的事。
上面一篇提到如何建立一个业务无关的结点,下面就要说一下树的组装。
设计思想是调用者通过TreeBuilder的构造方法加载所有结点,根据不同的需求通过TreeBuilder提供的方法得到相应的信息。
待树型结构被装配完成,通过拿到一个根结点就可以拿出整棵树的信息。
一点一点来吧:
--------------------------------------------
public class TreeBuilder<T> {
private static Logger logger = Logger.getLogger(TreeBuilder.class);
protected boolean inited=false; //是否已经初始化
private List<Node<T>> nodes; //根结点以外的结点
private Node<T> root; //根结点
public TreeBuilder(Node<T> root,List<Node<T>> nodes){
if (root == null) {
throw new RuntimeException("未指定根结点!");
}
if (nodes == null || nodes.size() == 0) {
throw new RuntimeException("没有叶子结点不能生成树!");;
}
this.root=root;
this.nodes=nodes;
}
}
从以上代码中可以得到以下信息:
1.它是一个泛型类,类型与结点的扩展属性的类型保持一致。
2.它要求一次性加载所有结点。
下面是一重要方法:
1.装配树型结构:
/**
* 装配树
* @param node
* @param grade 结点级别
* @param setParent 是否设置父结点,有时候没有必要设置,这样可以减少流量
*/
protected void setupTree(Node<T> node, int grade,boolean setParent) {
for (Node<T> n : nodes) {
if (n.getParentId().equals(node.getId())) {
n.setGrade(grade);
node.addChild(n);
if (n.getParentId().equals(root.getId())) {
n.setIsexpand(true);
}
setupTree(n, grade + 1,setParent);//递归装配所有结点,这里有个不妥,未进行循环引用检测
}
if(setParent){
n.setParent(node);
}
}
}
2.对结点进行排序
/**
* 对结点进行排序
* @param node
*/
public void sort(Node<T> node){
if (node==null) {
return;
}
if(node.getChildren()!=null&&node.getChildren().size()>0){
for (Node<T> n:node.getChildren()) {
sort(n);
}
Collections.sort(node.getChildren());
}
}
3.实用方法-得到经过排序的根结点
/**
* 得到根结点
* @return
*/
public Node<T> getRoot() {
if (!inited) {
init(false);
}
sort(root);
return root;
}
4. 设置所有结点包含结点的最大深度
/**
* 设置各个结点下面包含结点的最深层次
* @throws Exception
*/
protected void setupSubLevelsNum() throws Exception {
if (!inited) {
init(false);
}
if(nodes==null)
return;
for (Node<T> n : getLeaves()) {
int i=1;
while(n.getParent()!=null){
Node<T> parent=n.getParent();
if(parent.getSubLevels()<i)
parent.setSubLevels(i++);
n=parent;
}
}
root.setSubLevels(getMaxLevel());
}
5. 得到已经设置好最深层次的树的根结点
public Node<T> getKnowSubLevelsRoot() throws Exception {
setupSubLevelsNum();
return root;
}
6.得到树的深度
/**
* 得到树的最大深度
* @return
*/
public int getMaxLevel() {
if (nodes==null||nodes.size()==1) {
return 1;
}
int level=1;
for(Node<T> node:getLeaves()){
if (node.getGrade()>level) {
level=node.getGrade();
}
}
return level;
}
7.提到指定结点的所有子结点
public List<Node<T>> getChildrenInNodeId(String id) {
for (Node<T> n : nodes) {
if (n.getId().equals(id)) {
return n.getChildren();
}
}
return null;
}
8.得到指定级别的所有结点
public List<Node<T>> getNodesInGraged(int grage) throws Exception {
if (!inited) {
init(false);
}
List<Node<T>> list = new ArrayList<Node<T>>();
for (Node<T> n : nodes) {
if (n.getGrade() == grage) {
list.add(n);
}
}
return list;
}
9.得到所有叶子结点
public List<Node<T>> getLeaves() {
List<Node<T>> list = new ArrayList<Node<T>>();
for (Node<T> n : nodes) {
if (n.getChildren() == null) {
list.add(n);
}
}
return list;
}
到此树的常用功能已经整合好了,只要去实例化一个treebuilder就可以做得到一个树型结构了。
在下一篇,我会说一些如何在前台展示树型结构的内容,希望大家来捧场。
谢谢大家!!
欢迎留言!
--------------------------------------------
分享到:
相关推荐
7. **编程实现**:在JavaScript中,实现树形结构菜单通常涉及递归算法,用于遍历和构建树结构。同时,可能还需要配合数据模型(如JSON对象)来存储和传递菜单数据。 总结来说,“好看的树形结构菜单”是一个结合了...
在Delphi中,我们可以使用TTreeview控件来创建基本的树形结构,但要实现无限级别的树形结构,通常需要自定义逻辑和递归算法。无限树形结构意味着节点可以有任意数量的子节点,且这些子节点也可以继续扩展出更多的子...
**Dtree:构建优雅的树形结构菜单** 在IT领域,树形结构是一种常见的数据组织方式,它模拟了自然界中的树状层次关系,用于表示具有层级关系的数据。Dtree是专门用于创建美观、多级的树形结构导航菜单的工具,广泛...
本文将深入探讨如何使用MyBatis进行父子级树形结构查询,避免繁琐的代码拼接。 首先,我们了解MyBatis的`collection`标签。在MyBatis的映射XML文件中,`<collection>`标签用于表示一对多的关系,它允许我们在一次...
Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发中。...通过阅读所提供的文档,你将能够深入理解Struts2框架如何与树形结构结合,以及如何在实际项目中实现和优化这种结构。
本文将深入探讨“带数据库的递归经典树形菜单”这一主题,结合给定的文件内容,包括如何实现递归,构建树形结构,以及如何通过SQL语句来管理和操作数据。 首先,我们要理解“递归”这一概念。在编程中,递归是一种...
总结来说,"使用SSH框架实现的树形结构"项目涵盖了Spring、Struts2和Hibernate的综合运用,以及树形结构的展现和多对多关系的处理。开发过程中,需要熟练掌握各个框架的核心概念和技术,同时理解数据库设计和前端...
总之,使用JavaScript和Java结合实现的网页树形结构需要综合运用前端和后端技术。通过JavaScript处理动态交互,Java处理数据获取和更新,我们可以创建出一个高效、易用且功能丰富的资源管理器式界面。而"dtreeofme...
在iOS开发中,树形结构是一种常见的数据组织方式,它以节点的形式呈现,每个节点可以有零个或多个子节点,这些子节点又可以有自己...希望这篇分享能帮助你对iOS中的树形结构有更深入的理解,并欢迎提出更多讨论和建议。
总结来说,将数据表转化为树形结构是一项涉及到数据处理、算法运用以及前端展示的综合任务。通过合理的数据模型设计、高效的算法实现以及适用的前端库,我们可以将复杂的数据层次关系以清晰、易用的树状视图呈现出来...
`DOM`解析器将整个XML文档加载到内存中,形成一个树形结构,便于遍历和操作;而`SAX`解析器则采用事件驱动的方式,逐个处理XML元素,对内存要求较低,适合处理大型XML文件。在这个项目中,由于树形菜单可能包含多层...
在IT行业中,构建一个产品自主组装的树形结构是提高用户体验和交互效率的重要方式,尤其在电子产品销售领域,用户可以根据自身需求自由选择组件,形成定制化的产品。本话题聚焦于如何利用CSS技术来实现这样的功能,...
你可以自定义LayoutManager来实现树形结构,或者使用第三方库如Android-TreeView。 四、第三方库 1. Android-TreeView:这是一个流行的第三方库,它基于RecyclerView实现,提供丰富的定制选项和良好的性能。 2. ...
在微信小程序开发中,`wx-tree` 是一个用于展示层级关系数据的重要组件,它能够以图形化的方式呈现树形结构,适用于目录、组织结构、文件系统等场景。本篇文章将深入探讨`wx-tree`的使用方法、核心概念以及在实际...
在处理层次结构数据如树形结构时,递归特别有效,因为它可以方便地遍历和处理每一层节点。在TreeList中,每个节点可能有子节点,这些子节点又可能有它们自己的子节点,以此类推,形成一个深度未知的树状结构。 ...
在模板中,我们遍历`nodes`数组,并为每个子节点创建一个新的`TreeMenu`实例,将子节点的`nodes`和`label`传递下去,实现了无限层级的树形结构。 使用递归组件的关键在于确保组件能够正确处理自身的实例以及接收到...
在IT行业中,树形结构是一种常见的数据表示方式,尤其在前端开发中,它常用于构建层级关系,如导航菜单、文件目录、组织架构等。"checkbox树形展开效果"是这种概念的一个具体应用,它结合了多选框(checkbox)与树形...
4. **递归处理**:在处理多级嵌套时,通常需要使用递归函数来遍历整个树形结构,更新所有相关节点的选中状态。 5. **API交互**:如果数据是从服务器获取的,那么在用户做出选择后,需要将选定的节点ID或自定义值...
在iOS应用中,我们可以使用`UITableView`或者`UICollectionView`来模拟树形结构,通过递归的方式加载子节点。`RATreeView`库可能已经封装了这些逻辑,提供了更方便的方法来处理树的展开、折叠以及节点的添加和删除...
本示例源码“Android应用源码使用listView实现的树状结构”旨在教你如何利用ListView创建具有层次感的树形结构,这对于组织分类信息或者构建导航菜单非常有用。我们将探讨以下几个关键知识点: 1. **ListView基础**...