`
idreamblue
  • 浏览: 1988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

树形结构

阅读更多
    最近看程序日志发现有一个DAO层的statement有问题,后来发现是在数据库中递归时发生的,索性今天做了个树形的模型,把数据库的东东查出来统统放到里边去。然后自己输出树形结构。
     最终得到是一个已经排序的list,里边的model包含深度。

     问题有如下:
     1.该树型结构只是简单用了java中的集合类,性能还有待进一步提高,但是如果你想处理一般问题比如菜单,模块授权之类的东东那么一点问题都没有(我一千多个主题区非常快,建议用缓存如memcached、coherence)。
     2.我发现在排序字段都一样的情况下,数据库递归出来的顺序和该模型出来的顺序是有细微差别的,因为数据库在排序字段一致的情况下又按照某种规则来排序的。

      先让大家拍拍砖,后期会重构下。

     为了更好的扩展,id和父id都用了String类型。
代码如下:
public interface INode{
	
	public String getNodeId();
	
	public String getParentNodeId();

	public int getNodeDepth();

	public void setNodeDepth(int depth);
	
	public int getNodeSort();
	
	public String getNodeName();

	public List<INode> getChildren();
	
	public void addChildNode(INode node);
	
	public boolean equals(INode obj);
}






package treemodel;

public class NodeRepository {

	private List<INode> rootNodes = new ArrayList<INode>();//根节点集合用于递归开始
	private List<INode> nodes     = new ArrayList<INode>();//所有节点的集合

	private String rootKey        = null;//根节点null表示自己寻找根节点

	private Map<String, String> ids  = new HashMap<String, String>();//适合没有指定根节点的情况

	private List<INode> _nodes    = new ArrayList<INode>();//结果可以直接在视图迭代

	public boolean addNode(INode new_node) {
		if (null == new_node) {
			return false;
		}
		
		if (nodes.contains(new_node)) {
			return false;
		}

		for (INode cur_node : nodes) {
			//新节点是当前节点的子节点
			if ( new_node.getParentNodeId().equals(cur_node.getNodeId()) ) {
				new_node.setNodeDepth(cur_node.getNodeDepth() + 1);
				cur_node.addChildNode(new_node);
			}
			//新节点是当前节点的父节点
			if ( new_node.getNodeId().equals(cur_node.getParentNodeId()) ) {
				if (cur_node.getNodeDepth() > 0) {
					new_node.setNodeDepth(cur_node.getNodeDepth() - 1);
				} else {
					//如果当前节点的深度还是0那么必须递归更改子节点的深度
					buildDepth(cur_node);
				}
				new_node.addChildNode(cur_node);
			}
		}

		nodes.add(new_node);
		ids.put(new_node.getNodeId(), "0");

		if (rootKey != null) {
			//如果指定根节点,则直接加入根节点集合
			if ( rootKey.equals(new_node.getParentNodeId()) ) {
				rootNodes.add(new_node);
			}
		}

		return true;
	}

	public List<INode> generateTree() {
		if (rootKey == null) {
			//如果没有指定根节点,则必须判断根节点
			generateRootNodes();
		}

		sort(rootNodes);//根节点排序
		Iterator<INode> iter_nodes = rootNodes.listIterator();
		while (iter_nodes.hasNext()) {
			//开始递归节点
			buildTree(iter_nodes.next());
		}
		return _nodes;
	}

	private void generateRootNodes() {
		Iterator<INode> iter_nodes = nodes.listIterator();
		INode node = null;
		while (iter_nodes.hasNext()) {
			node = iter_nodes.next();
			if (!ids.containsKey(node.getParentNodeId())) {
				rootNodes.add(node);
			}
		}
	}

	//递归深度
	private void buildDepth(INode node) {
		node.setNodeDepth(node.getNodeDepth() + 1);
		if (node.getChildren().size() > 0) {
			for (INode n : node.getChildren()) {
				buildDepth(n);
			}
		}
	}

	private void buildTree(INode a_node) {
		_nodes.add(a_node);//加入结果集合
		List<INode> childen = a_node.getChildren();
		if (childen.size() > 0) {
			sort(childen);
			for (INode node : childen) {
				buildTree(node);
			}
		}
	}
	
	//子节点排序
	private void sort(List<INode> items) {
		Collections.sort(items, new Comparator<INode>() {
			public int compare(INode o1, INode o2) {
				if (o1.getNodeSort() > o2.getNodeSort()) {
					return 1;
				} else if (o1.getNodeSort() < o2.getNodeSort()) {
					return -1;
				} else {
					return 0;
				}
			}
		});
	}

	public void setRootKey(String rootKey) {
		this.rootKey = rootKey;
	}
}


0
0
分享到:
评论

相关推荐

    mysql 树形结构查询

    mysql 树形结构查询 MySQL 树形结构查询是指使用存储过程来实现 MySQL 数据库中的树形结构查询。这种查询方式可以高效地查询树形结构的数据,并且可以根据需要设置递归深度。 MySQL 中的树形结构查询可以使用存储...

    LABVIEW树形结构实例

    **LABVIEW树形结构实例详解** LabVIEW,全称Laboratory Virtual Instrument Engineering Workbench,是一款由美国国家仪器(NI)公司开发的图形化编程环境,主要用于数据采集、测量控制和科学计算。在LabVIEW中,树...

    可编辑的树形结构

    在IT领域,树形结构是一种常见的数据表示方式,它模仿了自然界中的树,其中每个节点可以有零个或多个子节点。在这个特定的场景中,我们讨论的是“可编辑的动态树形结构”,这意味着用户不仅可以查看这个树状图,还...

    jsp树形结构的生成

    jsp树形结构的生成 jsp树形结构的生成是指使用jsp技术生成一个导航树,实现树形结构的展示。jsp树形结构的生成可以应用于各种Web应用程序中,例如文件管理系统、组织结构管理系统等。 jsp树形结构的生成可以使用...

    菜单树形结构,支持三级、多级树形结构代码

    在IT领域,尤其是在前端开发中,菜单树形结构是一种常见的数据展示方式,它能够清晰地组织和层次化复杂的导航信息。本项目提供的是一段手写的代码,用于构建支持三级乃至多级的树形结构,适应于不同的应用需求,并且...

    树形结构设计总结java demo

    在IT领域,特别是软件开发中,树形结构是一种常见的数据结构,它被广泛应用于各种场景,如文件系统、计算机科学中的编译器、图形用户界面的菜单系统等。本篇文章将深入探讨“树形结构设计”在Java环境下的实现,并...

    java-根据过滤条件显示树形结构

    在Java编程中,构建和显示树形结构是一种常见的任务,特别是在数据表示、文件系统操作或者组织复杂的对象层次结构时。本篇文章将详细讲解如何在Java中根据过滤条件来实现这一功能,同时也会提及所需的jar包。 首先...

    基于JAVA建立树形结构的算法优化.pdf

    树形结构是一种在计算机科学和数据管理中广泛应用的非线性数据结构,它模拟了现实世界中实体之间的层级关系,例如公司的组织结构、计算机文件系统的目录结构等。树形结构在程序设计中极为重要,尤其是在需要展示层级...

    Android树形结构RecyclerView

    在本项目中,我们关注的是一个特别的应用场景——"Android树形结构RecyclerView",这是一个专门设计用于展示无限层级数据的RecyclerView实现。这种组件在企业级应用中尤其常见,如组织架构、文件目录、分类导航等,...

    好看的树形结构菜单

    在IT界,尤其是在前端开发中,"好看的树形结构菜单"是一种常见的用户界面元素,用于组织和展示层次化的数据或功能。树形结构菜单通常由节点(nodes)组成,每个节点可以包含子节点,形成一个可展开和折叠的层级结构...

    JS 做的树形结构比较简单明了

    在JavaScript(JS)中,构建树形结构是一种常见的任务,特别是在网页交互和数据展示中。树形结构是一种数据组织方式,模拟自然界中的树状结构,其中每个元素(节点)可以有零个或多个子节点。这种结构使得数据的层次...

    vue实现的树形结构加多选框示例

    本文主要探讨了使用Vue框架实现带有复选框的树形结构组件,重点在于在已有的递归组件基础上添加多选框功能,并实现一些基本的交互逻辑。要实现这样的功能,需要考虑以下几个关键技术点: 1. **递归组件的使用**:...

    树形结构插件

    树形结构插件是一种在软件应用中用于组织和展示数据的工具,特别是在文档管理和信息架构领域广泛应用。这种插件能够将复杂的数据以层次化的、易于理解的树状形式展现出来,用户可以直观地看到各个元素之间的关系,...

    Android 树形结构的多选CheckBox

    在Android开发中,实现树形结构的多选CheckBox是一项常见的需求,主要用于展现层次关系的数据,并允许用户进行多项选择。这个“Android 树形结构的多选CheckBox”项目提供了一个易于集成和使用的解决方案。 首先,...

    树形结构(增删改查刷新等功能附SQL脚本)

    在IT领域,树形结构是一种常见的数据组织方式,它模拟了自然界中的树状层次关系,广泛应用于文件系统、数据库索引、计算机科学的算法设计等多个方面。在这个项目中,我们探讨的是如何在Java环境中,利用JSP(Java...

    使用jsTree实现js树形结构

    **jsTree:构建前端树形结构的利器** jsTree 是一个强大的 JavaScript 库,专用于在 Web 页面上创建交互式的树形结构。它基于纯 JavaScript 编写,无需依赖其他库,因此对于初学者和有经验的开发者来说,都是一个...

    树形结构记事本treepad

    **树形结构记事本Treepad** Treepad是一款基于树形结构的文本编辑器,它为用户提供了组织、存储和管理信息的高效方式。在这款记事本软件中,信息以节点的形式呈现,每个节点可以包含文本内容,也可以进一步扩展为子...

    Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)

    数据结构为数组中包含对象–树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据。本文为用Vue实现方式,另有一篇为用knockout.js的实现方法。 ...

    在PB中实现datawindow树形结构(实现关键技术 )

    在PowerBuilder中实现DataWindow树形结构的关键技术与实践 一、树形结构的重要性与应用场景 树形结构在软件开发中扮演着至关重要的角色,尤其是在处理具有层级关系的数据时。这种结构不仅能够清晰地展现数据之间的...

    无限级树形结构组件,支持单选和多选组件,支持搜索,面包屑类型导航

    在IT行业中,构建用户界面时,常常需要处理各种数据结构,特别是树形结构。树形结构组件在数据展示、组织管理、导航等方面有着广泛的应用。本文将深入探讨一个特别的树形组件,它具备无限级、单选、多选、搜索及面包...

Global site tag (gtag.js) - Google Analytics