Java数据结构——应用DFS算法计算流程图下游节点(1)

问题描述:

前端在绘制流程图的时候,某些情况需要对某个节点之后的流程图进行折叠,因此需要得到某个节点的ID后,计算出这个ID下游之后的所有节点(找到的节点,边也就找到了)

已知条件:

某个节点的ID,流程图解析成对应的JSON对象文件(有的是将流程图解析成XML文件)

例如:

XML 复制代码
{
    "nodes": [
        {
            "id": "A"
        },
        {
            "id": "B"
        },
        {
            "id": "C"
        }
    ],
    "edges": [
        {
            "sourceNode": "A",
            "targetNode": "B"
        },
        {
            "sourceNode": "B",
            "targetNode": "C"
        }
    ]
}

问题解决:

java 复制代码
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import java.util.*;

public class FlowChartDFS {

    // 定义节点类
    static class Node {
        public String id; // 节点ID
        public Set<String> nextNodes = new HashSet<>(); // 存放下游节点id的集合

        public Node(String id) {
            this.id = id;
        }
    }

    // 定义边类
    static class Edge {
        public String sourceNode; // 边的起始节点ID
        public String targetNode; // 边的目标节点ID

        public Edge(String sourceNode, String targetNode) {
            this.sourceNode = sourceNode;
            this.targetNode = targetNode;
        }
    }

    // 解析JSON数据,构建节点和边的关系图
    public static Map<String, Node> buildGraphFromJson(String jsonStr) {

        JSONObject flowChartJson = JSONObject.parseObject(jsonStr);
        JSONArray nodesJson = flowChartJson.getJSONArray("nodes");
        JSONArray edgesJson = flowChartJson.getJSONArray("edges");

        Map<String, Node> graph = new HashMap<>();
        for (int i = 0; i < nodesJson.size(); i++) {
            JSONObject nodeJson = nodesJson.getJSONObject(i);
            String nodeId = nodeJson.getString("id");
            Node node = new Node(nodeId);
            graph.put(nodeId, node);
        }
        for (int i = 0; i < edgesJson.size(); i++) {
            JSONObject edgeJson = edgesJson.getJSONObject(i);
            String sourceNodeId = edgeJson.getString("sourceNode");
            String targetNodeId = edgeJson.getString("targetNode");
            Node sourceNode = graph.get(sourceNodeId);
            sourceNode.nextNodes.add(targetNodeId);
        }
        return graph;
    }

    // DFS深度优先递归搜索指定节点的下游所有节点和边
    public static void dfs(String startNodeId, Set<String> visitedNodeIds, List<Edge> edges, Map<String, Node> graph) {
        Node node = graph.get(startNodeId);
        if (node == null || visitedNodeIds.contains(startNodeId)) {
            return;
        }
        visitedNodeIds.add(startNodeId);
        for (String nextNodeId : node.nextNodes) {
            Edge edge = new Edge(startNodeId, nextNodeId); // 记录边的信息
            edges.add(edge);
            // 递归循环
            dfs(nextNodeId, visitedNodeIds, edges, graph);
        }
    }

    public static void main(String[] args) {
        // JSON数据示例
        String jsonStr = "{\"nodes\": [{\"id\": \"A\"},{\"id\": \"B\"},{\"id\": \"C\"}], \"edges\": [{\"sourceNode\": \"A\", \"targetNode\": \"B\"},{\"sourceNode\": \"B\",\"targetNode\": \"C\"}]}";

        // 构建关系图
        Map<String, Node> graph = buildGraphFromJson(jsonStr);

        // 指定起始节点ID
        String startNodeId = "A";

        // 初始化已访问节点集合和边列表
        Set<String> visitedNodeIds = new HashSet<>();
        List<Edge> edges = new ArrayList<>();

        // 进行DFS深度优先搜索
        dfs(startNodeId, visitedNodeIds, edges, graph);

        // 输出搜索结果
        System.out.println("节点" + startNodeId + "的下游节点和边:");
        for (Edge edge : edges) {
            System.out.println(edge.sourceNode + "->" + edge.targetNode);
        }
    }
}

补充:gson/UserGuide.md at main · google/gson · GitHub

引入Gson依赖

XML 复制代码
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.10.1</version>
        </dependency>

在线json格式化,json在线解析格式化,在线json验证,json格式化工具,json压缩-在线JSON (zxjson.com)

JSON代码工具 - 代码工具 - 脚本之家在线工具 (jb51.net)

使用Gson将JSON对象转换为字符串

java 复制代码
Gson gson = new Gson();
String jsonString = gson.toJson();
相关推荐
NAGNIP16 小时前
一文搞懂机器学习中的特征降维!
算法·面试
想摆烂的不会研究的研究生16 小时前
每日八股——Redis(1)
数据库·经验分享·redis·后端·缓存
NAGNIP16 小时前
一文搞懂机器学习中的特征构造!
算法·面试
毕设源码-郭学长17 小时前
【开题答辩全过程】以 基于SpringBoot技术的美妆销售系统为例,包含答辩的问题和答案
java·spring boot·后端
梨落秋霜17 小时前
Python入门篇【文件处理】
android·java·python
Java 码农17 小时前
RabbitMQ集群部署方案及配置指南03
java·python·rabbitmq
Learn Beyond Limits17 小时前
解构语义:从词向量到神经分类|Decoding Semantics: Word Vectors and Neural Classification
人工智能·算法·机器学习·ai·分类·数据挖掘·nlp
哈库纳玛塔塔17 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
追逐时光者17 小时前
精选 10 款 .NET 开源免费、功能强大的 Windows 效率软件
后端·.net
追逐时光者17 小时前
一款开源、免费的 WPF 自定义控件集
后端·.net