Java List 生成 树
package com.victop.ibs; import java.util.ArrayList;
import java.util.List; import org.apache.commons.collections.CollectionUtils; public class TreeBuilder { @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;
} 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;
} @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 com.victop.ibs;
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 + ", level =" + level + "}";
}
}
Java List 生成 树的更多相关文章
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- JAVA UUID 生成
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成UUID的API.UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址.纳秒级时间.芯 ...
- Java 动态生成复杂 Word
Java 动态生成复杂 Word 阅读目录 1. 制作 Word 模版,将你需要动态生成的字段用${}替换.2. 将 Word文档保存为 xml .3. 引入项目. 项目中需要用 java 程序生成d ...
- 用命令行编译java并生成可执行的jar包
用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...
- Java条形码生成技术-Barcode4j
背景 目前二维码的应用场景已经遍布各类互联网平台,通常是将产品/商品的唯一编号存储于二维码中以做扫码识别. 而用于生产环境的条形码技术仍然存在,如硬件设备制造.供应.物流运输等等. 在常见的产品信息管 ...
- 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题
因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...
- 将Eclipse中现有的java类生成类图
需求:将Eclipse中现有的java类生成类图 一:什么是ModelGoon? 它是一个Eclipse插件,用于基于UML图的模型设计,以及逆向工程(即从已有源代码生成类图). 二:安装 下载Mod ...
- JAVA自动生成正则表达式工具类
经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...
- Java随机生成定长纯数字或数字字母混合数
(转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码
随机推荐
- $\frac{\pi}{\sin p\pi}$
1.把 $f(x)=\cos px$ 在 $[-\pi,\pi]$ 上展开为 Fourier 级数. \[\cos px=\frac{\sin p\pi}{\pi}(\frac{1}{p}+\sum_ ...
- DBCC--CHECKDB--使用快照还是表锁
在SQL SERVER 2005及后续版本中, DBCC CHECKDB运行时不对数据表加排他锁,而使用内部数据库快照来保持数据一致性,内部数据库快照本质是sparse Filestream,使用Sp ...
- c# 控制台应用程序怎么隐藏黑窗口
class Program { [DllImport("user32.dll", EntryPoint = "ShowWindow", ...
- JQuery 的一个轻量级 Guid 字符串拓展插件.
(function ($) { function guid(g) { var arr = new Array(); //存放32位数值的数组 if (typeof (g) == "strin ...
- Enum 绑定到 CheckBox
第一种方法: 后台: internal static class EnumCache<T> where T : struct, IConvertible { private static ...
- C# GDI绘制仪表盘(纯代码实现)
纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...
- 双缓冲队列解决WPF界面卡死
工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...
- .net core初试 --- 控制台程序
.net core这个名字对.net程序员来说都不陌生了,但貌似圈子里真正有开发经验的并不多,关键是公司的项目没需求. 今天我就趁着不忙上手玩了玩,搞明白了一些东西,心中也有了十万个为什么.那么现在与 ...
- Weekly Contest 130
1029. Binary Prefix Divisible By 5 Given an array A of 0s and 1s, consider N_i: the i-th subarray fr ...
- 任务查询系统(cqoi2015,bzoj3932)(主席树)
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组\((S_i,E_i,P_i)\)描述,\((S_i,E_i,P_i)\)表示任务从第 ...