`

Java List 生成 树(增强版)

    博客分类:
  • java
阅读更多

 

Java List 生成 树:http://ysj5125094.iteye.com/blog/2283159

 

maven pom.xml

<dependency>
	<groupId>commons-collections</groupId>
	<artifactId>commons-collections</artifactId>
	<version>3.2.1</version>
</dependency>

 

TreeBuilder.java

package com.yusj.util.tree;

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

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;

import lac.framework.support.dictionary.domain.Dictionary;

public class TreeBuilder {
	@SuppressWarnings("unchecked")
	public List<? extends Node> buildListToTree(List<? extends Node> dirs) {
		List<Node> roots = findRoots(dirs);
		List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots);
		for (Node root : roots) {
			root.setChildren(findChildren(root, notRoots));
		}
		return roots;
	}

	private List<Node> findRoots(List<? extends Node> allNodes) {
		List<Node> results = new ArrayList<Node>();
		for (Node node : allNodes) {
			boolean isRoot = true;
			for (Node comparedOne : allNodes) {
				if (StringUtils.isNotBlank(node.getParentId()) && node.getParentId().equals(comparedOne.getId())) {
					isRoot = false;
					break;
				}
			}
			if (isRoot) {
				node.setLevel(0);
				results.add(node);
				node.setRootId(node.getId());
			}
		}
		return results;
	}

	@SuppressWarnings("unchecked")
	private List<Node> findChildren(Node root, List<Node> allNodes) {
		List<Node> children = new ArrayList<Node>();

		for (Node comparedOne : allNodes) {
			if (StringUtils.isNotBlank(comparedOne.getParentId()) && comparedOne.getParentId().equals(root.getId())) {
				comparedOne.setParent(root);
				comparedOne.setLevel(root.getLevel() + 1);
				children.add(comparedOne);
			}
		}
		List<Node> notChildren = (List<Node>) CollectionUtils.subtract(allNodes, children);
		for (Node child : children) {
			List<Node> tmpChildren = findChildren(child, notChildren);
			if (tmpChildren == null || tmpChildren.size() < 1) {
				child.setLeaf(true);
			} else {
				child.setLeaf(false);
			}
			child.setChildren(tmpChildren);
		}
		return children;
	}

	private List<Node> getLeafChildren(List<Node> resultList, List<Node> children) {
		for (Node node : children) {
			if (node.isLeaf()) {
				resultList.add(node);
			} else {
				getLeafChildren(resultList, node.getChildren());
			}
		}
		return resultList;
	}

	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception {
		TreeBuilder tb = new TreeBuilder();
		List<Node> allNodes = new ArrayList<Node>();

		allNodes.add(new Dictionary("1", "0", "001", "节点001", 0));
		allNodes.add(new Dictionary("2", "0", "002", "节点002", 0));
		allNodes.add(new Dictionary("3", "0", "003", "节点003", 0));
		allNodes.add(new Dictionary("4", "1", "004", "节点004", 0));
		allNodes.add(new Dictionary("5", "1", "005", "节点005", 0));
		allNodes.add(new Dictionary("6", "1", "006", "节点006", 0));
		allNodes.add(new Dictionary("7", "4", "007", "节点007", 0));
		allNodes.add(new Dictionary("8", "4", "008", "节点008", 0));
		allNodes.add(new Dictionary("9", "5", "009", "节点009", 0));
		allNodes.add(new Dictionary("10", "5", "010", "节点010", 0));
		allNodes.add(new Dictionary("11", "7", "011", "节点011", 0));
		allNodes.add(new Dictionary("12", "7", "012", "节点012", 0));

		// 显示所有节点
		List<Node> roots = (List<Node>) tb.buildListToTree(allNodes);
		for (Node n : roots) {
			System.out.println(JSON.toJSONString(n));
		}

		// 查找所有子节点
		List<Node> children = tb.findChildren(new Dictionary("1", "0"), allNodes);
		for (Node n : children) {
			System.out.println(JSON.toJSONString(n));
		}
		// 查找所有叶子节点
		System.out.println("------------------");
		List<Node> resultList = tb.getLeafChildren(new ArrayList<Node>(), children);
		for (Node n : resultList) {
			System.out.println(JSON.toJSONString(n));
		}
	}
}

 

Node.java(待转换的bean必须继承该类)

package com.yusj.util.tree;

import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnore;

import lac.framework.core.entity.IdEntity;

public class Node extends IdEntity{

	/**
	 * 
	 */
	private static final long serialVersionUID = 8875995344582620331L;
	private String parentId;
	private Node parent;
	private List<Node> children;
	private int level;
	private String rootId;
	private boolean leaf;
	
	public Node(){}
	public Node(String id, String parentId){
		this.setId(id);
		this.parentId = parentId;
	}
	
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	@JsonIgnore
	public Node getParent() {
		return parent;
	}
	public void setParent(Node parent) {
		this.parent = parent;
	}
	public List<Node> getChildren() {
		return children;
	}
	public void setChildren(List<Node> children) {
		this.children = children;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	public String getRootId() {
		return rootId;
	}
	public void setRootId(String rootId) {
		this.rootId = rootId;
	}
	public boolean isLeaf() {
		return leaf;
	}
	public void setLeaf(boolean leaf) {
		this.leaf = leaf;
	}
}

 

Dictionary.java

package com.yusj.support.dictionary.domain;

import com.yusj.util.tree.Node;

public class Dictionary extends Node{

	/**
	 * 
	 */
	private static final long serialVersionUID = 8875995344582620331L;
	private String code;
	private String label;
	private Integer sort;
	
	public Dictionary(){}
	public Dictionary(String id, String parentId){
		super(id, parentId);
	}
	public Dictionary(String id, String parentId, String code, String label, Integer sort){
		super(id, parentId);
		this.code = code;
		this.label = label;
		this.sort = sort;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getLabel() {
		return label;
	}
	public void setLabel(String label) {
		this.label = label;
	}
	public Integer getSort() {
		return sort;
	}
	public void setSort(Integer sort) {
		this.sort = sort;
	}
}

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    RtfTemplate实现Java生成word

    在Java开发中,生成Word文档是一项常见的需求,例如在报告生成、数据导出等场景。RtfTemplate是一个方便的工具库,它可以帮助开发者快速、高效地生成Word文档,特别是基于RTF(Rich Text Format)格式的文件。这个库...

    利用freemarker 模板生成pdf ,利用easypoi 生成excel(带图片,水印,分页)

    EasyPOI是Apache POI的增强版,主要用于简化Java操作Excel的工作。Apache POI是一个开源库,允许开发者在Java中读写Microsoft Office格式的文件,包括Excel。EasyPOI在Apache POI的基础上提供了更丰富的API,使得...

    Java API_5.0中文版

    Java API_5.0中文版是Sun Microsystems(后被Oracle收购)官方发布的文档,是Java学习者的重要参考资料。 在Java API 5.0中,有以下几个重要的知识点: 1. **泛型(Generics)**:Java 5.0引入了泛型,允许在类、...

    JAVA API官方文档 中文版

    `java.util`包含集合框架、日期时间、随机数生成等;`java.io`则涉及输入/输出流操作。 2. **网络编程**:`java.net`包提供了网络通信的支持,包括Socket和ServerSocket类,用于实现客户端和服务器端的连接。 3. *...

    Java API文档中文版.zip

    Java API文档是Java开发者不可或缺的参考资料,它详细地介绍了Java平台标准版(Java SE)的各种类库、接口和实现。这个“Java API文档中文版.zip”包含了一个.chm( Compiled HTML Help)文件,这是一种常见的帮助...

    java7解压版

    对于Java 7解压版,用户只需将压缩包解压到指定位置,然后设置环境变量`JAVA_HOME`指向JDK的安装目录,`PATH`添加`%JAVA_HOME%\bin`,确保系统可以在任何位置执行Java命令。 5. **使用注意事项** - 避免与其他...

    JAVA_API_中文版帮助文档.rar

    `java.util`包提供了大量实用工具类,如集合框架(List、Set、Map)、日期和时间类(Date、Calendar)、随机数生成器(Random)等。集合框架是Java编程中的核心部分,允许开发者存储、管理和操作对象集合。 `java....

    java 1.8 api google完整版

    5. **Stream API**:`java.util.stream`包,提供了一种处理大量数据的新方式,支持并行操作,增强了集合的处理能力。 6. **日期和时间API**:`java.time`包,取代了过时的`java.util.Date`和`java.util.Calendar`,...

    Java核心技术(第8版) 源码

    《Java核心技术(第8版)》是Java编程领域的一本经典教材,全面涵盖了Java语言的基础和高级特性。源码是理解书本理论的最佳实践,它提供了丰富的实例,帮助读者深入理解Java编程的本质。以下是根据标题和描述所涉及的...

    JAVA核心学习第10版

    《JAVA核心学习第10版》是一本深受Java开发者欢迎的经典教材,全面涵盖了Java编程的基础与进阶知识。这本书的第10版更是融入了最新的技术发展和更新,旨在为读者提供最前沿的Java学习体验。以下是根据书名、描述以及...

    java8中文文档API

    Java 8允许接口定义私有方法和静态方法,增强了接口的灵活性。 以上这些特性都在"java8中文文档API"中有所详细介绍,通过这个文档,开发者可以深入理解Java 8的新特性和使用方法,提升开发效率。

    JAVA帮助文档中文版

    3. **集合框架**:Java集合框架提供了各种容器(如ArrayList、LinkedList、HashMap等)和接口(如List、Set、Map),是组织和管理数据的核心工具。 4. **IO与NIO**:Java的输入/输出(IO)系统允许程序读写文件和...

    java1.7开发文档中文版

    Java 1.7 开发文档中文版是Java程序员在进行1.7版本编程时不可或缺的参考资料,它详尽地介绍了该版本中包含的各种类库、接口、方法以及异常处理等核心概念。这份文档以中文呈现,对于国内开发者来说,无疑提高了理解...

    java jdk1.6和1.7版本

    Java JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件开发工具包。JDK包含了编译器、调试器、Java运行时环境(JRE)以及其他辅助工具,使得开发者能够在各种平台上进行Java程序的...

    《Java 高级编程(第2版)》

    《Java 高级编程(第2版)》是一本深入探讨Java编程技术的权威书籍,旨在帮助读者掌握Java语言的高级特性和最佳实践。书中涵盖了广泛的Java开发主题,旨在提升开发者在实际项目中的技能和效率。这个压缩包包含了与...

    java核心技术第七版源代码卷二

    《Java核心技术第七版源代码卷二》是一本深入解析Java编程技术的重要参考资料,它涵盖了Java开发中的核心概念、原理及实战应用。这份压缩包包含了该书的所有实例代码,供学习者进行实践操作和深入理解。这里我们将...

    java开源包8

    淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的...

    java类库 java包

    Java类库是Java平台标准版(Java SE)的一部分,其中包括核心类库如`java.lang`、`java.util`和`java.io`等。这些类库极大地简化了程序员的工作,因为他们无需从零开始编写所有基础功能。 接下来,我们讨论Java包。...

    java api1.6、1.7

    Java API 1.6 和 1.7 是Java开发的关键组成部分,它们包含了Java标准库的详细文档,这些库是编写Java应用程序和服务器端程序的基础。这两个版本在Java发展历程中占据了重要地位,引入了许多新特性,优化了性能,并...

    java语言程序设计 梁勇 第十版答案.zip

    4. **集合框架**:Java集合框架是处理对象组的一个核心部分,包括List、Set、Map接口及其实现类,如ArrayList、HashSet、HashMap等。了解它们的特点和应用场景对于编写高效代码至关重要。 5. **输入/输出(I/O)**:...

Global site tag (gtag.js) - Google Analytics