说到组装树形结构数据,一般首先想到的就是递归或者反射处理,这种处理数据的方式比较直观简单,但是有个缺点,如果数据量过大比如几万几十万,处理的速度就会非常慢。
下面是一种高效处理树形数据的代码
@Getter
@Setter
@Accessors(chain = true)
public class Node<T extends Node<T>> implements Serializable {
private static final long serialVersionUID = -5718813852451029714L;
private String code;
private String parentCode;
private List<T> childList;
private Integer sortNum;
}
public static <T extends Node<T>> List<T> buildTree(List<T> nodes) {
Map<String, T> nodeMap = new HashMap<>();
List<T> roots = new ArrayList<>();
for (T node : nodes) {
nodeMap.put(node.getCode(), node);
}
for (T node : nodes) {
String parentCode = node.getParentCode();
if (parentCode == null || parentCode.isEmpty()) {
roots.add(node);
} else {
Node<T> parentNode = nodeMap.get(parentCode);
if (parentNode != null) {
if (parentNode.getChildList() == null) {
parentNode.setChildList(new ArrayList<>());
}
parentNode.getChildList().add(node);
parentNode.getChildList().sort(Comparator.comparing(t -> t.getSortNum() != null ? t.getSortNum() : 0));
} else {
roots.add(node);
}
}
}
roots.sort(Comparator.comparing(t -> t.getSortNum() != null ? t.getSortNum() : 0));
return roots;
}