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

news/2024/5/18 22:01:19 标签: 流程图, 算法, 深度优先, 数据结构, java, 后端

问题描述:

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

已知条件:

某个节点的ID,流程图解析成对应的JSON对象文件(有的是将流程图解析成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依赖

        <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();


 


http://www.niftyadmin.cn/n/5095488.html

相关文章

[架构之路-238]:目标系统 - 纵向分层 - 网络通信 - 网络规划与设计框架

目录 一、需求分析 二、网络规划与设计 三、逻辑网络设计 四、物理设计 五、分层网络设计 5.1 接入层交换机 5.2 汇聚层交换机 5.3 核心层交换机 六、网络存储技术 七、IPV6 八、综合布线系统 九、物联网 十、云计算 十一、云存储 一、需求分析 二、网络规划与设…

qt软件正常运行的崩溃了定位行号方法

软件&#xff08;debug版exe或者release版exe&#xff09;在正常运行状态下&#xff08;不是gdb调试运行&#xff09;&#xff0c;如果软件崩掉&#xff0c;那么会直接闪退&#xff0c;软件什么也做不了&#xff0c;此时无法保存软件中的状态信息&#xff0c;此外&#xff0c;也…

OpenHarmony自定义组件的生命周期

自定义组件的创建和渲染流程 自定义组件的创建&#xff1a;自定义组件的实例由ArkUI框架创建。 初始化自定义组件的成员变量&#xff1a;通过本地默认值或者构造方法传递参数来初始化自定义组件的成员变量&#xff0c;初始化顺序为成员变量的定义顺序。 如果开发者定义了abou…

2023年10月工作经验及问题整理总结

目录 1.window自带的base64加密解密 2.ElementUI修改鼠标移动到表格的背景色 3.vscode保存时几万个eslint错误 4.Git 拉取Gitee仓库报错&#xff1a;“fatal: unable to access ": Failed to connect to 127.0.0.1 port 1080: Connection r... 4.1本地查看Git是否使用…

【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】

【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】前言Python版本OpenCVWindows平台安装OpenCVopencv调用onnx模型 C版本…

运维 | 如何在 Linux 系统中删除软链接 | Linux

运维 | 如何在 Linux 系统中删除软链接 | Linux 介绍 在 Linux 中&#xff0c;符号链接&#xff08;symbolic link&#xff0c;或者symlink&#xff09;也称为软链接&#xff0c;是一种特殊类型的文件&#xff0c;用作指向另一个文件的快捷方式。 使用方法 我们可以使用 ln…

在vscode中配置git bash终端、git 源码管理

打开vscode文件->首选项->设置&#xff0c;打开设置搜索shell windows将以下配置添加到vscode中的settings.json中 注意&#xff1a; terminal.integrated.profiles.windows这个配置项是就是添加终端的terminal.integrated.defaultProfile.windows这个是配置默认选项的…

PC电脑 VMware安装的linux CentOs7如何扩容磁盘?

一、VM中进行扩容设置 必须要关闭当前CentOS&#xff0c;不然扩展按钮是灰色的。 输入值必须大于当前磁盘容量。然后点击扩展&#xff0c;等待扩展完成会提示一个弹框&#xff0c;点击确定&#xff0c;继续确定。 二、操作CentOS扩容——磁盘分区 第一步设置完成。那就启动 …