public class TreeUtil2<T extends TreeFeature> { private TreeUtil2() { } public static TreeUtil2 getInstance() { return new TreeUtil2(); } public Set<Node<T>> getTree(List<? extends T> list, Long parentId) { if (list.size() == 0) { return null; } List<? extends T> children = list.stream().filter(x -> ((T) x).getPid().equals(parentId)).collect(Collectors.toList()); List<? extends T> successor = list.stream().filter(x -> !((T) x).getId().equals(parentId)).collect(Collectors.toList()); Set<Node<T>> set = new TreeSet<>(); for (T t : children) { Node<T> node = new Node<T>(); node.setData(t); set.add(node); Set<Node<T>> tree = getTree(successor, t.getId()); if (tree != null) { node.setSNodes(tree); } } return set; } public void getChildren(List<? extends T> list, List<? super T> target, Long id) { List<? extends T> children = list.stream().filter(x -> id.equals(x.getPid())).collect(Collectors.toList()); List<? extends T> other = list.stream().filter(x -> !id.equals(x.getPid())).collect(Collectors.toList()); if (CollectionUtils.isEmpty(children)) { return; } target.addAll(children); for (T group : children) { getChildren(other, target, group.getId()); } } public void getChildren(Node<? extends T> node, List<? super T> target) { target.add(node.getData()); Set<? extends Node<? extends T>> sNodes = node.getSNodes(); for (Node<? extends T> n : sNodes) { getChildren(n, target); } } public void getParents(List<? extends T> list, List<? super T> target, Long currentPos) { Optional<? extends T> first = list.stream().filter(x -> ((T) x).getId().equals(currentPos)).findFirst(); if (first.isPresent()) { T t = first.get(); target.add(t); getParents(list, target, first.get().getPid()); } } public boolean belong(Long child, Long ancestor, List<T> list) { List<T> target = new LinkedList<>(); getParents(list, target, child); boolean b=target.stream().filter(x -> x.getId().equals(ancestor)).findFirst().isPresent(); return b; } public boolean contains(Long ancestor, Long child, List<T> list) { List<T> target = new LinkedList<>(); getChildren(list, target, ancestor); boolean b=target.stream().filter(x -> x.getId().equals(child)).findFirst().isPresent(); return b; } }
public class Node<T extends Comparable> implements Comparable { /** * 存放的数据 */ private T data; /** * 存放的子节点引用 */ private Set<Node<T>> sNodes;
}