You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何基于集合内容绘制图?解析XML后绘图遇阻求助

解决HashMap存储的顶点边可视化问题

我来给你几个Java生态里实用的方案,能轻松把你这个HashMap<String, ArrayList<String>>里的顶点和边转成可视化的图:

方案1:用JGraphX(成熟的Java图形库)

JGraphX是Java平台上很流行的绘图库,支持交互式图形展示,步骤清晰易上手:

  1. 先引入Maven依赖(Gradle可自行转换):
<dependency>
    <groupId>com.mxgraph</groupId>
    <artifactId>mxgraph</artifactId>
    <version>4.2.2</version>
</dependency>
  1. 编写代码将HashMap转成图形并展示:
import com.mxgraph.layout.mxOrganicLayout;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;

import javax.swing.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class GraphDrawer {
    public static void main(String[] args) {
        // 你的HashMap数据
        HashMap<String, List<String>> graphData = new HashMap<>();
        graphData.put("A", List.of("B", "C"));
        graphData.put("B", List.of("H", "J"));
        graphData.put("Y", List.of("Z"));

        mxGraph graph = new mxGraph();
        Object parent = graph.getDefaultParent();

        // 用Set避免重复添加顶点
        Set<String> vertices = new HashSet<>();
        vertices.addAll(graphData.keySet());
        graphData.values().forEach(vertices::addAll);

        // 开始构建图形
        graph.getModel().beginUpdate();
        try {
            // 先添加所有顶点,用Map存起来方便后续关联边
            HashMap<String, Object> vertexMap = new HashMap<>();
            for (String vertex : vertices) {
                vertexMap.put(vertex, graph.insertVertex(parent, null, vertex, 0, 0, 80, 30));
            }

            // 添加所有边
            for (String source : graphData.keySet()) {
                for (String target : graphData.get(source)) {
                    graph.insertEdge(parent, null, "", vertexMap.get(source), vertexMap.get(target));
                }
            }

            // 自动布局图形,避免顶点重叠
            new mxOrganicLayout(graph).execute(parent);
        } finally {
            graph.getModel().endUpdate();
        }

        // 弹出窗口展示图形
        JFrame frame = new JFrame("Graph Visualization");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new mxGraphComponent(graph));
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
}

运行后会得到一个交互式窗口,你可以拖拽顶点调整位置,缩放查看细节。

方案2:用GraphStream(轻量级快速可视化)

如果想要更简洁的实现,GraphStream的API更直观,代码量更少:

  1. 引入Maven依赖:
<dependency>
    <groupId>org.graphstream</groupId>
    <artifactId>gs-core</artifactId>
    <version>2.0</version>
</dependency>
<dependency>
    <groupId>org.graphstream</groupId>
    <artifactId>gs-ui</artifactId>
    <version>2.0</version>
</dependency>
  1. 核心代码:
import org.graphstream.graph.Graph;
import org.graphstream.graph.Node;
import org.graphstream.graph.implementations.SingleGraph;
import java.util.HashMap;
import java.util.List;

public class GraphStreamDrawer {
    public static void main(String[] args) {
        HashMap<String, List<String>> graphData = new HashMap<>();
        graphData.put("A", List.of("B", "C"));
        graphData.put("B", List.of("H", "J"));
        graphData.put("Y", List.of("Z"));

        // 创建图形实例
        Graph graph = new SingleGraph("My Graph");
        // 简单设置样式,让节点更美观
        graph.setAttribute("ui.stylesheet", "node { fill-color: lightblue; text-size: 16; }");
        graph.setAttribute("ui.quality");
        graph.setAttribute("ui.antialias");

        // 遍历数据添加节点和边
        for (String source : graphData.keySet()) {
            // 确保节点存在,重复添加不会报错
            Node sourceNode = graph.addNode(source);
            sourceNode.setAttribute("ui.label", source);

            for (String target : graphData.get(source)) {
                Node targetNode = graph.addNode(target);
                targetNode.setAttribute("ui.label", target);
                // 用source-target作为边的唯一ID,避免重复添加同一条边
                graph.addEdge(source + "-" + target, source, target);
            }
        }

        // 直接显示图形
        graph.display();
    }
}

运行后会弹出一个自动布局的图形窗口,支持缩放、拖拽等操作,上手非常快。

方案3:生成Graphviz DOT文件(非GUI,生成静态图片)

如果你不需要交互式窗口,只想生成静态图片,可以先生成Graphviz的DOT格式文本,再用Graphviz工具渲染成PNG/SVG等格式:

  1. 生成DOT文件的代码:
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

public class DotFileGenerator {
    public static void main(String[] args) {
        HashMap<String, List<String>> graphData = new HashMap<>();
        graphData.put("A", List.of("B", "C"));
        graphData.put("B", List.of("H", "J"));
        graphData.put("Y", List.of("Z"));

        // 构建DOT格式内容
        StringBuilder dotBuilder = new StringBuilder();
        dotBuilder.append("digraph MyGraph {\n");
        dotBuilder.append("    node [shape=box, style=filled, color=lightblue];\n");

        for (String source : graphData.keySet()) {
            for (String target : graphData.get(source)) {
                dotBuilder.append("    ").append(source).append(" -> ").append(target).append(";\n");
            }
        }

        dotBuilder.append("}");

        // 保存到本地文件
        try (FileWriter writer = new FileWriter("graph.dot")) {
            writer.write(dotBuilder.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 安装Graphviz工具后,执行命令生成图片:
dot -Tpng graph.dot -o graph.png

执行完就能得到一张静态的有向图图片,适合嵌入文档或报告。


内容的提问来源于stack exchange,提问作者SpaceyBot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:35:44