父子关系树或列表排序 发表于 2021-12-22 | 更新于 2022-04-26 | 分类于 Java | 阅读次数: | 字数: 3.5k | 时长 ≈ 3 分钟 标签 sort 父子关系列表排序 父节点在前,子节点在后 1234567891011121314151617181920212223242526272829/** * 按父子节点排序,父节点在子节点前面 * * @param departs 列表 * @return 排序列表 */public static List<Depart> sort(List<Depart> departs) { // 先找出所有的 root 元素 Queue<Depart> queues = departs.stream() .filter(d -> d.getParentId() == null || -1L == d.getParentId()) .collect(Collectors.toCollection(LinkedList::new)); return findChildren(departs, queues);}private static List<Depart> findChildren(List<Depart> departs, Queue<Depart> queues) { List<Depart> childrenList = new ArrayList<>(); while (queues.size() > 0) { // 弹出队列 Depart poll = queues.poll(); childrenList.add(poll); for (Depart depart : departs) { if (Objects.equals(depart.getParentId(), poll.getId())) { // 加入队列 queues.offer(depart); } } } return childrenList;} 倒序迭代 1234for (int i = departs.size() - 1; i >= 0; i--) { Depart depart = departs.get(i); log.info("部门 ---> depart: {}", depart);} 树结构数据123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475import lombok.Data;import lombok.NoArgsConstructor;import org.apache.commons.lang3.ObjectUtils;import java.io.Serializable;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * 树结构 */@Data@NoArgsConstructorpublic class TreeNode implements Serializable { private static final long serialVersionUID = 3083223582409151873L; private String id; private String label; private String parentId; private List<TreeNode> children = new ArrayList<>(); /** * 根据列表,构建树结构 * * @param list 列表 * @param rootId 根节点 Id * @return 树结构数据 */ public static List<TreeNode> convert(List<TreeNode> list, String rootId) { List<TreeNode> tree = new ArrayList<>(); Iterator<TreeNode> iterator = list.iterator(); while (iterator.hasNext()) { TreeNode node = iterator.next(); String parentId = node.getParentId(); // 根节点 if (ObjectUtils.isEmpty(parentId) || rootId.equals(parentId)) { tree.add(node); iterator.remove(); } } for (TreeNode node : tree) { List<TreeNode> children = TreeNode.getChildren(node, list); node.getChildren().addAll(children); } return tree; } /** * 获取子节点数据 * * @param parentNode 父节点 * @param list 所有节点集合 * @return 返回子节点列表 */ private static List<TreeNode> getChildren(TreeNode parentNode, List<TreeNode> list) { List<TreeNode> children = new ArrayList<>(); Iterator<TreeNode> iterator = list.iterator(); while (iterator.hasNext()) { TreeNode node = iterator.next(); // 如果当前节点 ID 与父节点 ID 一致,表示当前数据是该节点的子节点 if (parentNode.getId().equals(node.getParentId())) { children.add(node); iterator.remove(); } } // 递归调用 for (TreeNode node : children) { // 调用自身方法,依次添加子节点数据 node.getChildren().addAll(getChildren(node, list)); } return children; }} 本文作者: forever杨 本文链接: https://blog.yl-online.top/posts/1f7d4723.html 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!