在做项目中经常会用到地区的树形结构,而在数据库中我们一般存储的是一个地区ID,该地区对应的父节点ID,地区名称。下面仅以安徽省为例展示地区表结构:省 - 市 - 县
areaId parentId areaName
136 13 淮南市
135 13 蚌埠市
143 13 阜阳市
139 13 铜陵市
149 13 宣城市
133 13 合肥市
147 13 亳州市
138 13 淮北市
142 13 滁州市
。。。。。。
856 135 怀远县
857 135 五河县
858 135 固镇县
。。。。。。
需要列出中国每个省下面的市和县。
一种方法是通过表的自连接查询实现,这里不再描述。
第二种方法通过一次sql查询出所有的数据,接着通过递归技术每个省-市,每个省-(市、县)或只有县。
// typeMap 生成t_area表中父节点的所有子孙节点 Map<Integer, Set<Integer>> typeMap = new HashMap<Integer, Set<Integer>>(); // typeDirectMap 生成t_area表中父节点的所有直接子节点 Map<Integer, Set<Integer>> typeDirectMap = new HashMap<Integer, Set<Integer>>(); // parentKey-typeKey List<TArea> areaList = areaService.getArea(); for (TArea area : areaList) { Integer typeKey = area.getTypeKey(); Integer parentKey = area.getParentKey(); Set<Integer> set = typeMap.get(parentKey); if (null != set) { set.add(typeKey); } else { Set<Integer> newSet = new CopyOnWriteArraySet<Integer>(); newSet.add(typeKey); typeMap.put(parentKey, newSet); } } typeDirectMap.putAll(typeMap); traverseTypeMap(typeMap);
/** * 遍历typeMap中所有parent下面的直接child. * * @param typeMap */ private static void traverseTypeMap(Map<Integer, Set<Integer>> typeMap) { Set<Entry<Integer, Set<Integer>>> set = typeMap.entrySet(); for (Entry<Integer, Set<Integer>> entry : set) { Integer parentKey = entry.getKey(); Set<Integer> childSet = entry.getValue(); traverseChild(childSet, parentKey, typeMap); } }
/** * 遍历childSet * * @param childSet * @param pk * @param typeMap */ private static void traverseChild(Set<Integer> childSet, Integer pk, Map<Integer, Set<Integer>> typeMap) { for (Integer child : childSet) { addAllChildToParent(pk, typeMap, child); } }
/** * * @param pk 父节点 * @param typeMap * @param ch 子节点 */ private static void addAllChildToParent(Integer pk, Map<Integer, Set<Integer>> typeMap, Integer ch) { Set<Integer> set = typeMap.get(pk); Set<Integer> chSet = typeMap.get(ch); if (null != chSet) { Set<Integer> parentSet = new HashSet<Integer>(); addParent(typeMap, pk, parentSet); for (Integer p : parentSet) { typeMap.get(p).addAll(chSet); // 把当前子节点的集合加入到父节点的所有祖先集合中 } set.addAll(chSet); // 把当前子节点的集合加入到父节点集合中 traverseChild(chSet, ch, typeMap); } else { // 当前子节点集合为空 返回 return; } }
/** * 把当前节点pk的所有祖先节点加入到parentSet中. * * @param typeMap * @param pk * @param parentSet */ private static void addParent(Map<Integer, Set<Integer>> typeMap, Integer pk, Set<Integer> parentSet) { Set<Entry<Integer, Set<Integer>>> set = typeMap.entrySet(); for (Entry<Integer, Set<Integer>> entry : set) { Integer key = entry.getKey(); Set<Integer> value = entry.getValue(); if (value.contains(pk)) { parentSet.add(key); addParent(typeMap, key, parentSet); } else { return; // 是顶级父节点 } } }
相关推荐
要将这些数据转换为树形结构的JSON字符串,我们需要设计一个算法或方法来遍历数据库中的层次数据并构造相应的JSON结构。 在Ext JS框架中,树形控件分为TreeNode和AsyncTreeNode两种。TreeNode用于静态树,而...
此外,我们还需要定义方法来添加、删除文件和子文件夹,以及遍历整个树形结构。 `ListAllTest.java`可能是测试类,用于实例化`Folder`对象并展示整个目录树。在这个测试类中,我们通常会从用户指定的根目录开始,...
它通过构建一棵解空间树来进行搜索,与回溯法相似之处在于二者均采用树形结构来表示解空间。然而,它们之间在搜索策略上有着显著差异:回溯法倾向于使用深度优先搜索,而分枝定界法则倾向于宽度优先或基于成本的搜索...
这样的设计使得每个节点都可以通过其 `parentid` 字段关联到父节点,从而构建出一个完整的树形结构。 #### JSP 页面与 JavaBean 的交互 在 JSP 页面中,通过调用 JavaBean 来操作数据库。具体实现步骤如下: 1. *...
本文将详细介绍如何使用PHP中的tree类来创建和操作树形结构数据,给出具体的使用示例,方便需要处理类似需求的开发者参考。 ### 树形结构tree类用法 在PHP中实现树形结构通常会涉及到类的设计。我们主要关注`tree....
解析JSON数据并构造树形结构可以使用递归函数: ```javascript function buildTree(data) { let tree = new TreeNode(data.value); data.children.forEach(childData => { tree.addNode(buildTree(childData)); ...
在Android开发中,构建一个类似QQ好友菜单的多层树形结构是一项常见的需求。这种结构通常用于展现层次分明的数据,例如组织架构、文件系统或菜单导航等。在本篇文章中,我们将深入探讨如何在Android中实现这样的功能...
`dTree`是一个基于JavaScript的开源库,它提供了一种简单的方式来创建交互式的、可折叠的树形结构。这个库不仅支持静态数据的展示,还能处理动态加载的数据,尤其适合处理从服务器获取的无限层级的数据。 在生成树...
树形结构是一种常见的数据表现形式,它非常适合于表示具有层级关系的数据,比如公司的组织架构、文件系统的目录结构等。在Web开发中,树形结构的数据常用于构建动态的菜单、列表、分类目录等。树形结构通常由节点...
在UI层面,Android提供了多种控件和工具来展示树形结构,如ExpandableListView、RecyclerView配合自定义适配器等。用户可以通过点击节点来展开/折叠子节点,通过树形主键来定位并更新特定节点的数据。 5. 性能优化 ...
在C#中,我们可以使用`System.Windows.Forms.TreeView`控件来创建和管理这样的树形结构。 要创建树形菜单,首先需要在C#窗体中添加`TreeView`控件。这可以通过在设计视图中拖拽控件到窗体上,或者在代码中实例化`...
在本实验中,主题聚焦于数据结构中的二叉树,主要目标是掌握树形结构的特点,特别是二叉树的存储方式及其操作。实验内容包括按照先序遍历序列建立二叉树的二叉链表,并编写相关函数来统计二叉树的节点数量,以及用树...
在本文中,我们将深入探讨如何使用JavaScript来模仿Windows操作系统中的树形结构,这通常用于文件系统或组织结构的可视化展示。 首先,我们要理解树形结构的基本概念。在计算机科学中,树是一种非线性的数据结构,...
树形图表示是用圆圈表示结点,结点名字写在圆圈旁或圆圈内,子树与其根之间用无向边来连接。嵌套集合表示法是用集合的包含关系描述树结构。凹入表表示法类似于书的目录。 三、树结构的基本术语 树结构的基本术语...
在MFC(Microsoft Foundation Classes)库中,CListCtrl是一个非常重要的控件,它用于创建类似于Windows资源管理器中的文件列表视图。本教程将详细解释如何利用MFC的CListCtrl实现树形控件条目的拖放功能,这对于...
`Tree`类是整个程序的核心,其主要职责是通过遍历指定目录下的所有文件和子文件夹,构建出树形结构。这涉及到递归地访问每个目录,为每个文件或文件夹创建相应的`Node`对象,并将其添加到`NodeList`中。`Tree`类还...
它的基本特性是一个节点可以有零个或多个直接后继(子节点),与线性数据结构相比,树形结构可以表达更复杂的数据关系。树的根节点是唯一的,它没有父节点,其他节点则可以有一个或多个父节点。 2. 树的基本术语: ...
总结起来,这个示例展示了如何使用JavaScript和JSON数据构造一个树形结构,这对于数据可视化和组织复杂的层次数据非常有用。通过理解JSON的格式以及JavaScript的JSON处理方法,你可以创建自定义的树形视图,适应各种...