如何使用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
相关产品推荐
相关产品推荐

