package tree;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
public class TreeBuilder {
/**
* 将集合建立成树结构
*
* @param dirs
* @return
*/
@SuppressWarnings("unchecked")
private List<Node> buildListToTree(List<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;
}
/**
* 找出集合中的根元素
*
* @param allDirs
* @return
*/
public List<Node> findRoots(List<Node> allNodes) {
List<Node> results = new ArrayList<Node>();
for (Node node : allNodes) {
boolean isRoot = true;
for (Node comparedOne : allNodes) {
if (node.getParentId() == comparedOne.getId()) {
isRoot = false;
break;
}
}
if (isRoot) {
node.setLevel(0);
results.add(node);
node.setRootId(node.getId());
}
}
return results;
}
/**
* 递归找子目录
*
* @param root
* @param allDirs
* @return
*/
@SuppressWarnings("unchecked")
private List<Node> findChildren(Node root, List<Node> allNodes) {
List<Node> children = new ArrayList<Node>();
for (Node comparedOne : allNodes) {
if (comparedOne.getParentId() == 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;
}
public static void main(String[] args) {
TreeBuilder tb = new TreeBuilder();
List<Node> allNodes = new ArrayList<Node>();
allNodes.add(new Node(1,0,"节点1"));
allNodes.add(new Node(2,0,"节点2"));
allNodes.add(new Node(3,0,"节点3"));
allNodes.add(new Node(4,1,"节点4"));
allNodes.add(new Node(5,1,"节点5"));
allNodes.add(new Node(6,1,"节点6"));
allNodes.add(new Node(7,4,"节点7"));
allNodes.add(new Node(8,4,"节点8"));
allNodes.add(new Node(9,5,"节点9"));
allNodes.add(new Node(10,100,"节点10"));
List<Node> roots = tb.buildListToTree(allNodes);
for(Node n:roots){
System.out.println(n);
}
}
}
package tree;
import java.util.List;
public class Node implements java.io.Serializable {
private static final long serialVersionUID = -2721191232926604726L;
private int id;
private int parentId;
private Node parent;
private List<Node> children;
private String name;
private int level;
private int sort;
private int rootId;
private String type;
private boolean isLeaf;
private String description;
public Node() {
super();
}
public Node(int id, int parentId, String name) {
super();
this.id = id;
this.parentId = parentId;
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getType() {
return type;
}
public List<Node> getChildren() {
return children;
}
public void setChildren(List<Node> children) {
this.children = children;
}
public void setType(String type) {
this.type = type;
}
public boolean isLeaf() {
return isLeaf;
}
public void setLeaf(boolean isLeaf) {
this.isLeaf = isLeaf;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
public int getRootId() {
return rootId;
}
public void setRootId(int rootId) {
this.rootId = rootId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + parentId;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (id != other.id)
return false;
if (parentId != other.parentId)
return false;
return true;
}
@Override
public String toString() {
return "Node {id=" + id + ", parentId=" + parentId
+ ", children=" + children + ", name=" + name + "}";
}
}
分享到:
相关推荐
Java中的KD树是一种高效的数据结构,特别适用于处理高维空间的数据。它的全称为k-dimensional Tree,主要用于解决在k维空间中的查找、分类以及聚类问题。这种数据结构通过一系列的分割操作将高维空间划分为多个子...
在Java编程中,构建一个能够展示系统目录树结构的控件是常见的需求,尤其是在开发桌面应用或者需要用户浏览文件系统时。"Java目录树控件"的实现涉及到多个技术点,包括文件I/O操作、数据结构和图形用户界面(GUI)...
在Java开发中,构建部门树(Tree)是一个常见的需求,特别是在企业级应用中,用于展示组织结构或权限管理。这个项目提供了从JSP前端到Java后端的完整解决方案,非常适合初学者理解和学习,也能帮助有经验的开发者...
通过这些文件,开发者可以学习如何在Java Web环境中构建动态树形菜单,同时也可以根据自己的需求进行定制和扩展。此实例对于初学者和有经验的开发者来说都是一个有价值的参考,帮助他们理解和应用实际项目中的动态...
在Java编程中,构建多级树结构是一种常见的需求,特别是在数据组织、文件系统或图形用户界面设计中。这里我们讨论如何在Java中实现一个支持多根节点的树结构,并使用ZTree(一种流行的JavaScript库)进行展示。首先...
树形结构是一种在计算机科学和数据管理中广泛应用的非线性数据结构,它模拟了现实世界中实体之间的层级关系,例如公司的组织结构、计算机文件...通过对这些资料的学习,可以更好地掌握在Java中构建树形结构的核心技术。
在Java开发中,动态树形菜单和分页是常见的需求,尤其在构建Web应用程序时,它们对于用户界面的交互性和数据管理的效率至关重要。本文将深入探讨这两个概念以及如何在Java环境中实现它们。 首先,我们来看动态树形...
在Java编程中,构建和显示树形结构是一种常见的任务,特别是在数据表示、文件系统操作或者组织复杂的对象层次结构时。本篇文章将详细讲解如何在Java中根据过滤条件来实现这一功能,同时也会提及所需的jar包。 首先...
接下来,我们要了解如何在Java中构建和操作树形结构。这通常包括插入新节点、遍历树(前序、中序、后序)以及查找特定节点等操作。例如,前序遍历(根-左-右)可以通过递归实现: ```java public void ...
- **信息熵与基尼不纯度**:衡量数据集纯度的指标,信息熵用于信息论,基尼不纯度用于决策树构建。 2. **ID3算法** - ID3(Iterative Dichotomiser 3)是最早的决策树算法之一,基于信息熵进行特征选择。 - ID3...
本文将详细解析"java后缀树代码"这个主题,结合提供的文件列表,我们将会深入理解后缀树的实现原理,并探讨如何在Java中构建这种数据结构。 后缀树的核心在于它可以存储一个字符串的所有后缀,并且每个后缀只用一条...
2. **构建树形结构**: 要创建树形菜单,首先需要构建一个表示数据的树结构。这通常涉及到创建`DefaultMutableTreeNode`对象并设置它们的父子关系。例如,你可以创建一个根节点,然后添加子节点来表示菜单的不同层级...
综上所述,"java树节点逐级汇总.zip"这个资源提供了从无序列表数据构建树形结构并进行逐级汇总的功能。开发者可以利用提供的工具类和服务方法,根据自己的应用需求进行定制和扩展。在实际操作中,理解并掌握上述知识...
总结,Java中的无限极树结构涉及节点类的设计、遍历、插入删除操作、数据结构的构建以及在实际应用中的实现。理解这些知识点并熟练运用,对于处理层次关系的数据问题至关重要。在实际项目中,要根据具体需求选择合适...
- **循环**:Java的`for`和`while`循环用于重复执行特定代码块,这对于绘制多行或多列的图形至关重要。 - **条件语句**:`if`和`else`语句可用来根据条件改变输出,例如决定在哪个位置打印特殊字符(如星号`*`)以...
学习和理解这些示例对于初学者来说是非常有价值的,可以帮助快速掌握Java动态树的实现方式。 总之,Java动态树dhtmlxtree是一个强大且灵活的工具,它为Java Web应用提供了丰富的交互式树形视图功能,有助于提升用户...