diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java new file mode 100644 index 000000000..6bb2311ff --- /dev/null +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java @@ -0,0 +1,96 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.rule.tree.factory; + +import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractSortedTreeNode; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * 带排序功能的树构造器 + * + * @author fengshuonan + * @since 2024/9/7 20:53 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SortedTreeBuildFactory> extends DefaultTreeBuildFactory { + + public SortedTreeBuildFactory() { + super(); + } + + public SortedTreeBuildFactory(String rootParentId) { + super(rootParentId); + } + + @Override + public List doTreeBuild(List nodes) { + + // 先对列表进行排序 + nodes.sort(Comparator.comparing(AbstractSortedTreeNode::getSort)); + + // 将每个节点构造一个子树 + for (T treeNode : nodes) { + this.buildChildNodes(nodes, treeNode, new ArrayList<>()); + } + + // 只保留上级是根节点的节点,也就是只留下所有一级节点 + ArrayList results = new ArrayList<>(); + for (T node : nodes) { + if (node.getNodeParentId().equals(getRootParentId())) { + results.add(node); + } + } + + return results; + } + + @Override + protected void buildChildNodes(List totalNodes, T node, List childNodeLists) { + if (totalNodes == null || node == null) { + return; + } + + List nodeSubLists = getSubChildsLevelOne(totalNodes, node); + + // 对子节点进行排序 + nodeSubLists.sort(Comparator.comparing(AbstractSortedTreeNode::getSort)); + + if (!nodeSubLists.isEmpty()) { + for (T nodeSubList : nodeSubLists) { + buildChildNodes(totalNodes, nodeSubList, new ArrayList<>()); + } + } + + childNodeLists.addAll(nodeSubLists); + node.setChildrenNodes(childNodeLists); + } + +} diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/base/AbstractSortedTreeNode.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/base/AbstractSortedTreeNode.java new file mode 100644 index 000000000..6b1b8068a --- /dev/null +++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/base/AbstractSortedTreeNode.java @@ -0,0 +1,21 @@ +package cn.stylefeng.roses.kernel.rule.tree.factory.base; + +import java.math.BigDecimal; + +/** + * 带排序功能的树排序接口 + * + * @author fengshuonan + * @since 2024/9/7 20:42 + */ +public interface AbstractSortedTreeNode extends AbstractTreeNode { + + /** + * 获取排序 + * + * @author fengshuonan + * @since 2024/9/7 20:43 + */ + BigDecimal getSort(); + +}