本文已参与「新人创作礼」活动,一起开启掘金创作之路。
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 树
*
* @author
* @since 2016-11-08 22:51
*/
public class TreeUtil {
/**
* 节点
*/
public static class Node {
private Integer id;
private String name;
private Integer parentId;
private List children;
public Node() {
}
public Node(Integer id, String name, Integer parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public List getChildren() {
return children;
}
public void setChildren(List children) {
this.children = children;
}
public void addChild(Node child){
if(this.children == null){
this.children = new ArrayList<>();
}
this.children.add(child);
}
}
/**
* 转换树
*
* @param list
* @return
*/
public static List tree(List list){
Map idMap = new HashMap<>();
for (Node node : list) {
idMap.put(node.getId(), node);
}
List result = new ArrayList<>();
for (Node node : list) {
if(node.getParentId() != null && idMap.containsKey(node.getParentId())){
idMap.get(node.getParentId()).addChild(node);
} else {
result.add(node);
}
}
return result;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Node(1, "1", null));
list.add(new Node(11, "11", 1));
list.add(new Node(12, "12", 1));
list.add(new Node(111, "111", 11));
list.add(new Node(121, "121", 12));
list.add(new Node(122, "122", 12));
list.add(new Node(123, "123", 12));
list.add(new Node(1211, "1211", 121));
list.add(new Node(1222, "1222", 122));
list.add(new Node(1223, "1223", 122));
List result = tree(list);
printTree(result, null);
}
public static final String PREFIX_BRANCH = "├─";//树枝
public static final String PREFIX_TRUNK = "│ ";//树干
public static final String PREFIX_LEAF = "└─";//叶子
public static final String PREFIX_EMP = " ";//空
/**
* 输出树形
*
* @param nodes
* @param prefix
*/
public static void printTree(List nodes, String prefix){
if(prefix == null){
prefix = "";
} else {
prefix = prefix.replace(PREFIX_BRANCH, PREFIX_TRUNK);
prefix = prefix.replace(PREFIX_LEAF, PREFIX_EMP);
}
for(int i = 0; i < nodes.size(); i++){
//最后一个是叶子
if(i == nodes.size() - 1){
System.out.println(prefix + PREFIX_LEAF + nodes.get(i).getName());
if(nodes.get(i).getChildren() != null){
printTree(nodes.get(i).getChildren(), prefix + PREFIX_LEAF);
}
}
//树枝
else {
System.out.println(prefix + PREFIX_BRANCH + nodes.get(i).getName());
if(nodes.get(i).getChildren() != null){
printTree(nodes.get(i).getChildren(), prefix + PREFIX_TRUNK);
}
}
}
}
}