`
Franciswmf
  • 浏览: 780335 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java 递归 获取树形结构数据

 
阅读更多
	private static void print2(){
		List<Node> nullList=new ArrayList<Node>();
		//镇
		Node znode1=new Node("1000", "徐桥镇", "100", "1,10,100,", nullList, true, 4, 1);
		Node znode2=new Node("1001", "兴昌镇", "100", "1,10,100,", nullList, true, 4, 2);
		Node znode3=new Node("1002", "天桥镇", "100", "1,10,100,", nullList, true, 4, 3);
		//县
		Node xnode1=new Node("100", "太湖县", "10", "1,10,", nullList, false, 3, 1);
		Node xnode2=new Node("101", "宿松县", "10", "1,10,", nullList, false, 3, 2);
		Node xnode3=new Node("102", "望江县", "10", "1,10,", nullList, false, 3, 3);
		//市
		Node snode1=new Node("10", "安庆市", "1", "1,", nullList, false, 2, 1);
		Node snode2=new Node("11", "合肥市", "1", "1,", nullList, false, 2, 1);
		Node snode3=new Node("12", "黄山市", "1", "1,", nullList, false, 2, 1);
		//省
		Node wnode1=new Node("1", "安徽省", "", "", nullList, false, 1, 1);
		List<Node> list=new ArrayList<Node>();
		list.add(wnode1);
		list.add(xnode1);
		list.add(xnode2);
		list.add(xnode3);
		list.add(snode1);
		list.add(snode2);
		list.add(snode3);
		list.add(znode1);
		list.add(znode2);
		list.add(znode3);
		//
		Node node=TreeUtils.buildTree("1", list);//方法一
		System.out.println("结果:\n"+node.toString());
//		Node node2=TreeUtils.buildTreeNode("1", list);//方法二
//		System.out.println("结果:\n"+node2.toString());
	}
测试结果:

{"children":[{"children":[{"children":[{"children":[],"id":"1000","isLeaf":true,"level":4,"name":"徐桥镇","parentId":"100","parentIds":"1,10,100,","sort":1},{"children":[],"id":"1001","isLeaf":true,"level":4,"name":"兴昌镇","parentId":"100","parentIds":"1,10,100,","sort":2},{"children":[],"id":"1002","isLeaf":true,"level":4,"name":"天桥镇","parentId":"100","parentIds":"1,10,100,","sort":3}],"id":"100","isLeaf":false,"level":3,"name":"太湖县","parentId":"10","parentIds":"1,10,","sort":1},{"children":[],"id":"101","isLeaf":false,"level":3,"name":"宿松县","parentId":"10","parentIds":"1,10,","sort":2},{"children":[],"id":"102","isLeaf":false,"level":3,"name":"望江县","parentId":"10","parentIds":"1,10,","sort":3}],"id":"10","isLeaf":false,"level":2,"name":"安庆市","parentId":"1","parentIds":"1,","sort":1},{"children":[],"id":"11","isLeaf":false,"level":2,"name":"合肥市","parentId":"1","parentIds":"1,","sort":1},{"children":[],"id":"12","isLeaf":false,"level":2,"name":"黄山市","parentId":"1","parentIds":"1,","sort":1}],"id":"1","isLeaf":false,"level":1,"name":"安徽省","parentId":"","parentIds":"","sort":1}


public class Node {
	/**
	 * id
	 */
	private String id;
	/**
	 * 名称
	 */
	private String name;
	/**
	 * 父节点
	 */
	private String parentId;
	/**
	 * 所有的父节点
	 */
	private String parentIds;
	/**
	 * 子节点
	 */
	private List<Node> children;
	/**
	 * 是否叶子节点
	 */
	private Boolean isLeaf;
	/**
	 * 级别
	 */
	private Integer level;
	/**
	 * 序号
	 */
	private Integer sort;
	
	public Node() {
		super();
	}

	public Node(String id, String name, String parentId, String parentIds, List<Node> children, Boolean isLeaf,
			Integer level, Integer sort) {
		super();
		this.id = id;
		this.name = name;
		this.parentId = parentId;
		this.parentIds = parentIds;
		this.children = children;
		this.isLeaf = isLeaf;
		this.level = level;
		this.sort = sort;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	public String getParentIds() {
		return parentIds;
	}
	public void setParentIds(String parentIds) {
		this.parentIds = parentIds;
	}
	public List<Node> getChildren() {
		return children;
	}
	public void setChildren(List<Node> children) {
		this.children = children;
	}
	public Boolean getIsLeaf() {
		return isLeaf;
	}
	public void setIsLeaf(Boolean isLeaf) {
		this.isLeaf = isLeaf;
	}
	public Integer getLevel() {
		return level;
	}
	public void setLevel(Integer level) {
		this.level = level;
	}
	public Integer getSort() {
		return sort;
	}
	public void setSort(Integer sort) {
		this.sort = sort;
	}

	@Override
	public String toString() {
		return JSONObject.toJSONString(this);
	}


package com.test.tree;

import java.util.ArrayList;
import java.util.List;

public class TreeUtils {
	/*
	 * =============================================方法一===================================================================
	 */
	
	/**
	 * 获取树型结构数据(方法一)
	 * @param rootId 根节点id
	 * @param srcList 源list
	 * @return
	 */
	public static Node buildTree(String rootId, List<Node> srcList){
		Node rootNode=getNodeById(rootId, srcList);
		List<Node> children=buildChildren(rootNode.getId(), srcList);
		rootNode.setChildren(children);
		return rootNode;
	}
	
	/**
	 * 根据父节点递归获取子节点(方法一)
	 * @param parentId 父节点id
	 * @param srcList 源list
	 * @return
	 */
	public static List<Node> buildChildren(String parentId, List<Node> srcList){
		//parentId对应的子节点集合
		List<Node> children=new ArrayList<Node>();
		for (Node node : srcList) {
			if(node.getParentId().equals(parentId)){
				//装载parentId对应的子节点,属于二级节点
				children.add(node);
			}
		}
		if(!children.isEmpty()){
			//进一步递归获取子节点集合的子节点
			for (Node nod : children) {
				List<Node> childs=new ArrayList<Node>();
				if(!nod.getIsLeaf()){
					//不是叶子节点,则该node应该还有子节点(不一定有)
					childs=buildChildren(nod.getId(), srcList);
				}
				nod.setChildren(childs);
			}
		}
		return children;
	}
	
	/*
	 * =============================================方法二===================================================================
	 */
	
	/**
	 * 递归获取树型结构数据(方法二)
	 * @param parentId 父节点id
	 * @param srcList 源list
	 * @return
	 */
	public static Node buildTreeNode(String parentId, List<Node> srcList){
		//父节点
		Node node=getNodeById(parentId, srcList);
		List<Node> children=getChildrenNodeById(parentId, srcList);
		if(children.isEmpty()){
			node.setChildren(children);
		}else{
			List<Node> children2=new ArrayList<Node>();
			for (Node temp : children) {
				//递归
				Node child=buildTreeNode(temp.getId(), srcList);
				children2.add(child);
			}
			node.setChildren(children2);
		}
		return node;
	}
	
	/**
	 * 根据节点id获取子节点(方法二)
	 * @param parentId
	 * @param srcList
	 * @return
	 */
	public static List<Node> getChildrenNodeById(String parentId, List<Node> srcList){
		List<Node> children=new ArrayList<Node>();
		for (Node node : srcList) {
			if(node.getParentId().equals(parentId)){
				//装载parentId对应的子节点
				children.add(node);
			}
		}
		return children;
	}
	
	
	/**
	 * 获取节点(公共)
	 * @param nodeId 根节点id
	 * @param srcList 源list
	 * @return
	 */
	private static Node getNodeById(String nodeId, List<Node> srcList){
		for (Node node : srcList) {
			if(nodeId.equals(node.getId())){
				return node;
			}
		}
		return null;
	}
	
	
}

分享到:
评论

相关推荐

    java版list-map实现 树结构 父子结构 通俗易懂

    此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...

    JSP无限级分类目录树-sorttree.zip

    数据的获取和处理:在JSP页面中,需要通过SQL查询语句来获取数据库中的所有节点数据,并将其按照树形结构进行整理和排序。这样就可以在页面上展示出完整的导航树。 样式和交互设计:为了让用户更方便地浏览和访问...

    leetcode三角形打印-DataStructuresInJava:用Java实现各种数据结构和算法

    墨水打印Java中的数据结构 用Java实现数据结构和算法 动态数组实现 帕斯卡三角形的实现(锯齿状数组) 打印所有素数直到给定 n。 定理:假设所有数字都是素数,直到被证明为假。 单链表 标准单向链表:push/pop ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...

    易语言程序免安装版下载

    修改扩展界面支持库一,为“树形框”增加多态检查框功能,相应地添加了多个与检查框相关的属性、方法和事件。 17. 修改高级表格支持库,允许“复制选定文本()”“剪切选定文本()”在“允许选择块”属性为假时复制...

    PLSQLDeveloper下载

    对象浏览器——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览...

    freemarker总结

    这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: &lt;#case refValue&gt;... &lt;#case refValue&gt;... &lt;#default&gt;... 3、 list, break指令 list指令是一个迭代输出指令,用于迭代输出...

Global site tag (gtag.js) - Google Analytics