最近在看 TraceSonar 的源码的时候,看到生成树相关的代码, 感觉我自己徒手写应该是没戏了,至少他的这个方案是可以 work 的,同时像收集一下网上能找到的生成树的一些优秀代码
实践
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import java.util.ArrayList; import java.util.List;
public class Node<T> { private T data; private Node<T> parent = null;
private List<Node<T>> children = new ArrayList<>();
public Node(T data) { this.data = data; }
public Node<T> addChild(Node<T> child) { child.setParent(this); this.children.add(child); return child; }
public void addChildren(List<Node<T>> children) { children.forEach(each -> each.setParent(this)); this.children.addAll(children); }
public List<Node<T>> getChildren() { return children; }
public T getData() { return data; }
public void setData(T data) { this.data = data; }
private void setParent(Node<T> parent) { this.parent = parent; }
public Node<T> getParent() { return parent; }
public Node<T> getRoot() { if (parent == null) { return this; } return parent.getRoot(); } }
@Test public void test() { Node<String> root = new Node<>("root");
Node<String> node1 = root.addChild(new Node<>("node 1"));
Node<String> node11 = node1.addChild(new Node<>("node 11")); node11.addChild(new Node<>("node 111")); node11.addChild(new Node<>("node 112"));
node1.addChild(new Node<>("node 12"));
Node<String> node2 = root.addChild(new Node<>("node 2"));
node2.addChild(new Node<>("node 21")); node2.addChild(new Node<>("node 22"));
printTree(root, " "); }
private static <T> void printTree(Node<T> node, String appender) { System.out.println(appender + node.getData()); node.getChildren().forEach(each -> printTree(each, appender + appender)); }
|
这种解法,首先把树这种结构解析出来,单独作为一个载体,你可以根据自己的需求填充树中的内容,其次打印的时候用的 lambda 表达式也很简洁,很喜欢这个例子。
参考
javagists