From 2e98b20bea4463e4465e3c19059d0744a09aec06 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 27 Jun 2023 14:34:41 +0800
Subject: [PATCH] gb28181版本升级-补充

---
 src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java
new file mode 100644
index 0000000..8df6f50
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java
@@ -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();
+	}
+}

--
Gitblit v1.9.3