【8.3.0】【rule】更新带排序的树形构建

master
stylefeng 2024-09-07 21:17:07 +08:00
parent 2f2218a2a9
commit e0bbf345b2
2 changed files with 117 additions and 0 deletions

View File

@ -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.
*
* GunsAPACHE 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<T extends AbstractSortedTreeNode<T>> extends DefaultTreeBuildFactory<T> {
public SortedTreeBuildFactory() {
super();
}
public SortedTreeBuildFactory(String rootParentId) {
super(rootParentId);
}
@Override
public List<T> doTreeBuild(List<T> nodes) {
// 先对列表进行排序
nodes.sort(Comparator.comparing(AbstractSortedTreeNode::getSort));
// 将每个节点构造一个子树
for (T treeNode : nodes) {
this.buildChildNodes(nodes, treeNode, new ArrayList<>());
}
// 只保留上级是根节点的节点,也就是只留下所有一级节点
ArrayList<T> results = new ArrayList<>();
for (T node : nodes) {
if (node.getNodeParentId().equals(getRootParentId())) {
results.add(node);
}
}
return results;
}
@Override
protected void buildChildNodes(List<T> totalNodes, T node, List<T> childNodeLists) {
if (totalNodes == null || node == null) {
return;
}
List<T> 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);
}
}

View File

@ -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<T> extends AbstractTreeNode<T> {
/**
*
*
* @author fengshuonan
* @since 2024/9/7 20:43
*/
BigDecimal getSort();
}