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

如何使用JGrapht 1.5.2导入带顶点属性的DOT文件?

使用JGrapht导入带顶点属性的DOT文件并保留属性

要保留DOT文件中顶点的X、Y属性,你不能直接用String作为顶点类型,需要自定义顶点类来存储这些属性,同时配置DOTImporter的属性映射逻辑。以下是具体实现步骤:

1. 自定义顶点类

创建一个包含顶点标识、X、Y属性的类,并重写equals和hashCode方法(JGrapht依赖这两个方法识别唯一顶点):

public class Vertex {
    private String label;
    private int x;
    private String y;

    public Vertex(String label) {
        this.label = label;
    }

    // Getter和Setter方法
    public String getLabel() { return label; }
    public void setLabel(String label) { this.label = label; }
    public int getX() { return x; }
    public void setX(int x) { this.x = x; }
    public String getY() { return y; }
    public void setY(String y) { this.y = y; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Vertex vertex = (Vertex) o;
        return label.equals(vertex.label);
    }

    @Override
    public int hashCode() {
        return label.hashCode();
    }

    @Override
    public String toString() {
        return label + " [X=" + x + ", Y=" + y + "]";
    }
}

2. 配置DOTImporter并导入图形

通过setVertexAttributeProvider方法,将DOT文件中的顶点属性映射到自定义Vertex对象的字段:

import org.jgrapht.Graph;
import org.jgrapht.graph.SimpleDirectedGraph;
import org.jgrapht.nio.dot.DOTImporter;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Map;

public class DotImportExample {
    public static void main(String[] args) {
        // 创建有向图实例,顶点类型为自定义Vertex,边用DefaultEdge
        Graph<Vertex, DefaultEdge> graph = new SimpleDirectedGraph<>(DefaultEdge.class);

        // 初始化DOTImporter
        DOTImporter<Vertex, DefaultEdge> dotImporter = new DOTImporter<>();

        // 顶点工厂:根据DOT中的顶点标签创建Vertex对象
        dotImporter.setVertexFactory(label -> new Vertex(label));

        // 配置顶点属性提供者:读取X、Y属性并设置到Vertex对象
        dotImporter.setVertexAttributeProvider((vertex, attributes) -> {
            if (attributes == null) return;
            // 处理X属性(转换为整数)
            String xValue = attributes.get("X");
            if (xValue != null) {
                vertex.setX(Integer.parseInt(xValue));
            }
            // 处理Y属性(直接作为字符串)
            String yValue = attributes.get("Y");
            if (yValue != null) {
                vertex.setY(yValue);
            }
        });

        // 导入DOT文件(替换为你的文件路径)
        try (FileInputStream fis = new FileInputStream("test.dot")) {
            dotImporter.importGraph(graph, fis);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 验证导入结果:遍历顶点并打印属性
        graph.vertexSet().forEach(vertex -> {
            System.out.println("顶点: " + vertex.getLabel() + ", X=" + vertex.getX() + ", Y=" + vertex.getY());
        });
    }
}

关键说明

  • setVertexFactory:负责根据DOT中的顶点标签初始化Vertex对象。
  • setVertexAttributeProvider:接收解析后的顶点属性映射(键为属性名,值为属性值),将属性赋值给Vertex对象的对应字段。注意属性值默认是字符串类型,需要根据实际类型转换(比如X是整数,要做Integer.parseInt)。
  • 确保自定义Vertex类的equals和hashCode仅依赖顶点标签,避免因属性变化导致顶点识别错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:57:29