上饶市公安局wvp平台
zhongrj
2023-06-27 2e98b20bea4463e4465e3c19059d0744a09aec06
src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java
New file
@@ -0,0 +1,51 @@
package com.genersoft.iot.vmp.utils.node;
import com.genersoft.iot.vmp.utils.CollectionUtil;
import java.util.List;
/**
 * 森林节点归并类
 *
 */
public class ForestNodeMerger {
   /**
    * 将节点数组归并为一个森林(多棵树)(填充节点的children域)
    * 时间复杂度为O(n^2)
    *
    * @param items 节点域
    * @return 多棵树的根节点集合
    */
   public static <T extends INode<T>> List<T> merge(List<T> items) {
      ForestNodeManager<T> forestNodeManager = new ForestNodeManager<>(items);
      items.forEach(forestNode -> {
         if (forestNode.getParentId() != null) {
            INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId());
            if (node != null) {
               node.getChildren().add(forestNode);
            } else {
               forestNodeManager.addParentId(forestNode.getChannelId());
            }
         }
      });
      return forestNodeManager.getRoot();
   }
   public static <T extends INode<T>> List<T> merge(List<T> items, String[] parentIds) {
      ForestNodeManager<T> forestNodeManager = new ForestNodeManager<>(items);
      items.forEach(forestNode -> {
         if (forestNode.getParentId() != null) {
            INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId());
            if (CollectionUtil.contains(parentIds, forestNode.getChannelId())){
               forestNodeManager.addParentId(forestNode.getChannelId());
            } else {
               if (node != null){
                  node.getChildren().add(forestNode);
               }
            }
         }
      });
      return forestNodeManager.getRoot();
   }
}