`
gege_s
  • 浏览: 19086 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

树形结构之一 建立业务无关的结点类型

阅读更多

 

程序开发中经常会用到树型结构,如组织机构·菜单·角色(支持继承的角色)·分目录的参数管理。

 

下面是我的一段经历,来单位不久我被分配到一个客服平台开发的项目中,由一位‘资深’项目经理带着做,他已经有五到六年的工作经验

 

了,不过在后来的工作中发现,他这六年是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)利用结点的深度控制横向位置。

    树形结构的多种实现,其中有Ajax异步实现

    树形结构在IT行业中是一种常见的数据组织形式,它模拟了自然界中的树状关系,用于表示层级、分类或分层的数据。在本主题中,我们将深入探讨树形结构的多种实现方式,特别是涉及到Ajax异步实现的树形菜单。在实际项目...

    数据结构之树形结构ppt

    数据结构是计算机科学中至关重要的一个领域,而树形结构是数据结构的一种基本类型,它在计算机算法设计、数据库管理、编译原理等多个方面都有广泛的应用。本篇内容主要介绍了树的基本概念、树的遍历、树的线性表示...

    树形结构的c语言程序设计ppt

    《树形结构的C语言程序设计》PPT深入解析了树这一重要的数据结构,帮助读者构建全面的理解。在计算机科学中,树形结构是数据组织的一种形式,广泛应用于各种算法和数据管理。以下是对该PPT内容的详细阐述: 7.1 树...

    数据结构课程设计实验2 打印树形结构.docx

    数据结构课程设计实验二之树形结构的实现 在这篇课程设计报告中,我们将设计并实现一个树形结构的程序,主要功能包括创立二叉树、将二叉树以凹入表形式打印出来、对二叉树以中序遍历方式遍历。下面是程序的设计报告...

    二叉树c++算法,二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。

    从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作: (1)访问结点本身(N), (2)遍历该结点的左子树(L), (3)遍历该...

    建立带有头结点的链表

    * 可以实现复杂的数据结构:链表可以用来实现各种复杂的数据结构,例如图形和树形结构。 链表的缺点: * 存储空间的浪费:链表中每个结点都需要存储指针,占用了额外的存储空间。 * 查询效率低:链表的查询效率较...

    树形结构实例带数据库

    在IT领域,尤其是在软件开发中,树形结构是一种常见的数据表示方式,它模拟了自然界中的树状层次关系,便于组织和处理数据。本实例“树形结构实例带数据库”聚焦于如何在Delphi环境中利用树形结构来管理软硬件信息,...

    动态树形结构菜单,从数据库中动态读取节点,通过XML和JS创建树形结构

    从数据岛menuXML中读取数据,从树的根节点开始分析树, 利用 hasChildNodes() [方法:是否含有子节点 ] 判断当前 节点是否有子节点,如果有子节点继续向下...[对象:子节点对象集合] ,否则返回当前分析结果(树结点对象)。

    数据结构C语言树形结构PPT学习教案.pptx

    树形结构是数据结构中的一种重要的数据组织方式,它广泛应用于计算机科学和信息技术领域。这份学习教案详细介绍了树形结构的定义、表示方法、基本术语等相关知识点。 7.1.1 树的定义 树是由 n(n≥0) 个结点组成的...

    数据结构实验课二叉树叶子 C++

    二叉树是树形结构的一种重要类型。本算法是数据结构实验课上的一次实验,在熟悉二叉树结点的结构, 掌握二叉树的基本操作以及具体实现后,利用递归方法编写对二叉树这种递归数据结构进行处理的算法。

    数据结构教程:第7章 树形结构.ppt

    树形结构之所以在IT领域中占据重要地位,是因为它能够有效地表示具有层级关系的数据。通过对树的基本概念和操作的掌握,我们可以设计出更加高效和复杂的算法来解决现实世界中的问题。从最简单的二叉树到复杂的哈夫曼...

    在二叉树或更复杂的树形结构中,先序输出叶结点.txt

    先序输出度为1的结点

    题目:编写递归算法,将二叉树中所有结点的左右子树相互交换 - READ.doc

    * 二叉树是一种特殊的树形结构,每个结点最多有两个子树,即左子树和右子树。 * 在树形结构中,每个结点都可以看作是一个独立的单元,具有自己的属性和操作。 三、递归函数知识点 * 递归函数是一种特殊的函数,...

    理学数据结构树形结构PPT学习教案.pptx

    数据结构中的树形结构是一种非线性的数据组织方式,它以一种层次化的形式表示数据元素之间的关系。在树中,每个节点可以有多个子节点,除了根节点外,每个节点都只有一个父节点。这种结构广泛应用于计算机科学的各个...

    [原创]基于JQUERY的树形结构插件GooTree

    花生米AJAX-UI系列之:基于JQUERY的树形结构0.1版 feature: 1、可以静态载入一整棵树或子树,也可以动态AJAX载入一整棵树或子树 2、具有一般的对结点增,删,改,选中,取消选中的功能,并能让用户编写相关的触发事件...

    数据结构-第5章 树和二叉树.ppt

    二叉树是树形结构中的一种特殊类型,它的每个结点最多只有两个子树,左子树和右子树。二叉树的结构最简单,规律性最强,所有树都能转换为唯一对应的二叉树,不失一般性。 树的遍历方法是指从树的根结点出发,依次...

    理学数据结构树形结构PPT课件.pptx

    数据结构中的树形结构是一种非线性的数据组织方式,它以一种层次化的形式表示数据元素之间的关系。在树中,每个节点(除了根节点)都恰好有一个父节点,而一个节点可以有零个或多个子节点,这体现了“一对多”或“多...

    VC++列表框和树形结构目录的报告

    在这个实验报告中,作者探讨了如何在树形结构的目录下组织学校、院系、专业和班级的信息,并在列表框中动态显示所选结点的子目录信息。 首先,列表框(List Box)通常用于列出一系列选项,用户可以从中选择一个或多个...

Global site tag (gtag.js) - Google Analytics