程序开发中经常会用到树型结构,如组织机构·菜单·角色(支持继承的角色)·分目录的参数管理。
下面是我的一段经历,来单位不久我被分配到一个客服平台开发的项目中,由一位‘资深’项目经理带着做,他已经有五到六年的工作经验
了,不过在后来的工作中发现,他这六年是ctrl+c,ctrl+v过来的。
切入正题,我负责的模块中有一个是知识库的建立与应用,它的需求是这样的,要有一个目录,目录里有子目录,共要求三级目录,目录下
面对应着的是一些业务知识点供客服人员查看。
之前我没有用过树型结构,在这个程序里他们有写好的树型结构的读取工具,我看了看,大致如下做法是在后台组织一个html,然后发送到
前台再用js工具进行格式化成树的模样,具体操作是读很多次数据库数据,如果有三级就先读取一级结点,然后读取二级结点,再读取三级
结点。采用的是深度优先的做法把数据读取出来,在读取的时候组装html。
我看了以后头很大,因为我想用他们现有的模式去做,心里会很不舒服:
他们的做法有很多不足
1.在组装树型结构的时候会查询多次数据库,而且随着结点数目的增长,查询次数也随之增长很多。
2.不便于调试,有了问题很难发现。
3.不便于数据缓存。
4.增加网络流量。
5.针对一个js树型工具组装的html,如果换成其他的js工具几乎是不可能的。
6.代码没有可重用性,它把业务数据库与组装html混合在一起。
7.如果数据库数据出现循环引用,会在死循环里出不来,还有可能导致系统崩溃。
....
为了解决上述问题,我自己写了一个简单的树型结构加载工具,经历过数次的重构,在三个项目中使用。
定义一个结点类型:Node<T> 代码如下:
package com.**.power.tool.tree.node;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class Node<T> implements Serializable ,Comparable{
private static final long serialVersionUID = -8658937456797684778L;
private Node<T> parent; //父结点
private List<Node<T>> children; //子结点
private String id; //结点编号
private String text; //结点标签
private String parentId; //父结点编号
private int grade; //结点级别 根结点为0
private int subLevels; //结点下面最深有多少层
private boolean isexpand=false; //结点展开状态
public Node(){}
public Node(T t) {
this.extend=t;
}
//
private T extend; //扩展属性 用于扩展业务属性与指定的业务实体进行扩展
//....这里省去get set方法
@SuppressWarnings("unchecked")
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (super.equals(obj)) {
return true;
}
if (!(obj instanceof Node)) {
return false;
}
Node<T> target = (Node<T>) obj;
if (target.getId() == null) {
return false;
}
if (target.hashCode()==hashCode()) {
return true;
}
return false;
}
@Override
public int compareTo(Object o) {
if (o instanceof Node ) {
Node tmp=(Node) o;
Object ext=tmp.getExtend();
if (ext!=null&&this.getExtend()!=null) {
if (ext instanceof Comparable&&this.getExtend() instanceof Comparable) {
Comparable extcomp=(Comparable)this.extend;
Comparable tmpcomp=(Comparable)tmp.getExtend();
int i= tmpcomp.compareTo(extcomp);
System.out.println(i);
return i;
}
}
}
return 0;
}
}
从注释上可以看出以下几点:
1.它是一个泛型类型
2.业务无关
3.有可扩展属性
4.实现了Comparable接口,从而实现对结点进行排序
这个从接口实现上可以看出,先去查看它的扩展属性是不是实现了Comparable,如果实现了就用扩展属性进行比较,如果没有实现,就不进行比较返回0,表示相等以免对结点不必要的移动。
5.它有grade级别和subLevels下面最多有多少层,以便判断是不是对该结点进行相关操作。
这篇博客到此吧,下次再说如果组装树型结构。
谢谢大家来捧场!!
欢迎留言讨论!
分享到:
相关推荐
对树形结构的结点从1开始,自上而下,自左而右按层序编码,编码是64进制数,用java语言实现。对存取在mysql数据库的树形结构应该有帮助。 对一棵树的结点进行编码的步骤如下: 首先,对根节点编码,调用TreeCodeSet....
无按凹入表形式打印树形结构。(1)利用树的先根遍历方法; (2)利用结点的深度控制横向位置。
树形结构在IT行业中是一种常见的数据组织形式,它模拟了自然界中的树状关系,用于表示层级、分类或分层的数据。在本主题中,我们将深入探讨树形结构的多种实现方式,特别是涉及到Ajax异步实现的树形菜单。在实际项目...
数据结构是计算机科学中至关重要的一个领域,而树形结构是数据结构的一种基本类型,它在计算机算法设计、数据库管理、编译原理等多个方面都有广泛的应用。本篇内容主要介绍了树的基本概念、树的遍历、树的线性表示...
《树形结构的C语言程序设计》PPT深入解析了树这一重要的数据结构,帮助读者构建全面的理解。在计算机科学中,树形结构是数据组织的一种形式,广泛应用于各种算法和数据管理。以下是对该PPT内容的详细阐述: 7.1 树...
数据结构课程设计实验二之树形结构的实现 在这篇课程设计报告中,我们将设计并实现一个树形结构的程序,主要功能包括创立二叉树、将二叉树以凹入表形式打印出来、对二叉树以中序遍历方式遍历。下面是程序的设计报告...
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作: (1)访问结点本身(N), (2)遍历该结点的左子树(L), (3)遍历该...
* 可以实现复杂的数据结构:链表可以用来实现各种复杂的数据结构,例如图形和树形结构。 链表的缺点: * 存储空间的浪费:链表中每个结点都需要存储指针,占用了额外的存储空间。 * 查询效率低:链表的查询效率较...
在IT领域,尤其是在软件开发中,树形结构是一种常见的数据表示方式,它模拟了自然界中的树状层次关系,便于组织和处理数据。本实例“树形结构实例带数据库”聚焦于如何在Delphi环境中利用树形结构来管理软硬件信息,...
从数据岛menuXML中读取数据,从树的根节点开始分析树, 利用 hasChildNodes() [方法:是否含有子节点 ] 判断当前 节点是否有子节点,如果有子节点继续向下...[对象:子节点对象集合] ,否则返回当前分析结果(树结点对象)。
树形结构是数据结构中的一种重要的数据组织方式,它广泛应用于计算机科学和信息技术领域。这份学习教案详细介绍了树形结构的定义、表示方法、基本术语等相关知识点。 7.1.1 树的定义 树是由 n(n≥0) 个结点组成的...
二叉树是树形结构的一种重要类型。本算法是数据结构实验课上的一次实验,在熟悉二叉树结点的结构, 掌握二叉树的基本操作以及具体实现后,利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
树形结构之所以在IT领域中占据重要地位,是因为它能够有效地表示具有层级关系的数据。通过对树的基本概念和操作的掌握,我们可以设计出更加高效和复杂的算法来解决现实世界中的问题。从最简单的二叉树到复杂的哈夫曼...
先序输出度为1的结点
* 二叉树是一种特殊的树形结构,每个结点最多有两个子树,即左子树和右子树。 * 在树形结构中,每个结点都可以看作是一个独立的单元,具有自己的属性和操作。 三、递归函数知识点 * 递归函数是一种特殊的函数,...
数据结构中的树形结构是一种非线性的数据组织方式,它以一种层次化的形式表示数据元素之间的关系。在树中,每个节点可以有多个子节点,除了根节点外,每个节点都只有一个父节点。这种结构广泛应用于计算机科学的各个...
花生米AJAX-UI系列之:基于JQUERY的树形结构0.1版 feature: 1、可以静态载入一整棵树或子树,也可以动态AJAX载入一整棵树或子树 2、具有一般的对结点增,删,改,选中,取消选中的功能,并能让用户编写相关的触发事件...
二叉树是树形结构中的一种特殊类型,它的每个结点最多只有两个子树,左子树和右子树。二叉树的结构最简单,规律性最强,所有树都能转换为唯一对应的二叉树,不失一般性。 树的遍历方法是指从树的根结点出发,依次...
数据结构中的树形结构是一种非线性的数据组织方式,它以一种层次化的形式表示数据元素之间的关系。在树中,每个节点(除了根节点)都恰好有一个父节点,而一个节点可以有零个或多个子节点,这体现了“一对多”或“多...
在这个实验报告中,作者探讨了如何在树形结构的目录下组织学校、院系、专业和班级的信息,并在列表框中动态显示所选结点的子目录信息。 首先,列表框(List Box)通常用于列出一系列选项,用户可以从中选择一个或多个...