如果觉得接口对json序列化有影响,可以使用 @JsonIgnore
来消除影响
| |
| |
| |
| |
| |
| public interface TreeNode<T> { |
| |
| |
| |
| |
| |
| T id(); |
| |
| |
| |
| |
| |
| |
| T parentId(); |
| |
| |
| |
| |
| |
| |
| boolean root(); |
| |
| |
| |
| |
| |
| |
| void setChildren(List<? extends TreeNode<T>> children); |
| |
| |
| |
| |
| |
| |
| List<? extends TreeNode<T>> getChildren(); |
| } |
| import org.springframework.util.CollectionUtils; |
| |
| import java.util.*; |
| |
| |
| |
| |
| |
| |
| |
| |
| public class TreeUtils { |
| |
| |
| |
| |
| |
| |
| |
| public static <T extends TreeNode<?>> List<T> generateTrees(List<T> nodes) { |
| List<T> roots = new ArrayList<>(); |
| for (Iterator<T> ite = nodes.iterator(); ite.hasNext(); ) { |
| T node = ite.next(); |
| if (node.root()) { |
| roots.add(node); |
| |
| ite.remove(); |
| } |
| } |
| roots.forEach(r -> { |
| setChildren(r, nodes); |
| }); |
| return roots; |
| } |
| |
| |
| |
| |
| |
| |
| |
| @SuppressWarnings("all") |
| public static <T extends TreeNode> void setChildren(T parent, List<T> nodes) { |
| List<T> children = new ArrayList<>(); |
| Object parentId = parent.id(); |
| for (Iterator<T> ite = nodes.iterator(); ite.hasNext(); ) { |
| T node = ite.next(); |
| if (Objects.equals(node.parentId(), parentId)) { |
| children.add(node); |
| |
| ite.remove(); |
| } |
| } |
| |
| if (children.isEmpty()) { |
| return; |
| } |
| parent.setChildren(children); |
| children.forEach(m -> { |
| |
| setChildren(m, nodes); |
| }); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static <T extends TreeNode<?>> List<T> getLeafs(T parent) { |
| List<T> leafs = new ArrayList<>(); |
| fillLeaf(parent, leafs); |
| return leafs; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| @SuppressWarnings("all") |
| public static <T extends TreeNode> void fillLeaf(T parent, List<T> leafs) { |
| List<T> children = parent.getChildren(); |
| |
| if (CollectionUtils.isEmpty(children)) { |
| leafs.add(parent); |
| return; |
| } |
| |
| for (T child : children) { |
| fillLeaf(child, leafs); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static <T extends TreeNode<M>,M> List<T> getChain(T node, Map<M,T> id2Node) { |
| List<T> chain = new ArrayList<>(); |
| chain.add(node); |
| M parentId = node.parentId(); |
| T parent = id2Node.get(parentId); |
| while (parent != null) { |
| chain.add(parent); |
| parentId = parent.parentId(); |
| parent = id2Node.get(parentId); |
| } |
| return chain; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static <T extends TreeNode<M>,M> Map<T,List<T>> getChains(List<T> nodes, Map<M,T> id2Node) { |
| Map<T,List<T>> map = new LinkedHashMap<>(); |
| for (T node : nodes) { |
| List<T> chain = getChain(node, id2Node); |
| map.put(node,chain); |
| } |
| return map; |
| } |
| } |
generateTrees
方法生成树,可以自行添加其他方法,比如遍历树方法
点击查看代码
| |
| |
| |
| |
| |
| |
| |
| |
| @Getter |
| @Setter |
| @AllArgsConstructor |
| @NoArgsConstructor |
| @Accessors(chain = true) |
| @Builder |
| @TableName(value = "template",autoResultMap = true) |
| public class Template implements TreeNode<Long> { |
| |
| private static final long serialVersionUID = 1L; |
| @TableId(value = "id", type = IdType.AUTO) |
| private Long id; |
| |
| @ApiModelProperty(value = "父级id,0没有父级") |
| @TableField("parent_id") |
| private Long parentId; |
| |
| @ApiModelProperty(value = "模板名称") |
| private String templateName; |
| |
| @ApiModelProperty(value = "子模板列表") |
| @TableField(exist = false) |
| private List<Template> children; |
| |
| |
| @Override |
| public Long id() { |
| return id; |
| } |
| |
| @Override |
| public Long parentId() { |
| return parentId; |
| } |
| |
| @Override |
| public boolean root() { |
| return Objects.equals(0L,parentId); |
| } |
| |
| @Override |
| public void setChildren(List children) { |
| this.children=children; |
| } |
| |
| } |
| List<Template> templateList=templateMapper.selectList(null); |
| List<Template> ret= TreeUtils.generateTrees(templateList); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏