Java 如何映射jgrapht图<;富,E>;到另一个图形<;巴,E>;?
我有以下图表:Java 如何映射jgrapht图<;富,E>;到另一个图形<;巴,E>;?,java,data-conversion,jgrapht,Java,Data Conversion,Jgrapht,我有以下图表: private final Graph<Foo, DefaultWeightedEdge> graph = buildGraph(); @Override public Graph<Foo, DefaultWeightedEdge> buildGraph() { return GraphTypeBuilder .directed() .allowingSelfLoops(false)
private final Graph<Foo, DefaultWeightedEdge> graph = buildGraph();
@Override
public Graph<Foo, DefaultWeightedEdge> buildGraph() {
return GraphTypeBuilder
.directed()
.allowingSelfLoops(false)
.weighted(true)
.allowingMultipleEdges(false)
.vertexClass(Foo.class)
.edgeClass(DefaultWeightedEdge.class)
.buildGraph();
}
private final Graph=buildGraph();
@凌驾
公共图buildGraph(){
返回图形类型生成器
.directed()
.允许自循环(错误)
.加权(真)
.allowingMultipleEdges(假)
.SS(食品类)
.edgeClass(DefaultWeightedEdge.class)
.buildGraph();
}
如何将其映射到类型为Graph
的图形
我还向Nikolais answer映射了边缘,因为它没有转换DefaultWeightedEdge的源类型和目标类型:
public <V, Vv> Graph<Vv, DefaultWeightedEdge> convert(Graph<V, DefaultWeightedEdge> source, Function<V, Vv> vertexMapper) {
Graph<Vv, DefaultWeightedEdge> result = GraphTypeBuilder.<Vv, DefaultWeightedEdge>forGraphType(source.getType()).edgeClass(DefaultWeightedEdge.class).buildGraph();
source.vertexSet().forEach(v -> result.addVertex(vertexMapper.apply(v)));
source
.edgeSet()
.forEach(
e -> {
V sourceV = source.getEdgeSource(e);
Vv mappedSourceV = vertexMapper.apply(sourceV);
V targetV = source.getEdgeTarget(e);
Vv mappedTargetV = vertexMapper.apply(targetV);
result.addVertex(mappedSourceV);
result.addVertex(mappedTargetV);
DefaultWeightedEdge ee = result.addEdge(mappedSourceV, mappedTargetV);
double edgeWeight = source.getEdgeWeight(e);
result.setEdgeWeight(ee, edgeWeight);
});
return result;
公共图形转换(图形源,函数vertexMapper){
Graph结果=GraphTypeBuilder.forGraphType(source.getType()).edgeClass(DefaultWeightedEdge.class).buildGraph();
source.vertexSet().forEach(v->result.addVertex(vertexMapper.apply(v));
来源
.edgeSet()
弗雷奇先生(
e->{
V sourceV=source.getEdgeSource(e);
Vv mappedSourceV=vertexMapper.apply(sourceV);
V targetV=source.getEdgeTarget(e);
Vv mappedTargetV=顶点映射器。应用(targetV);
结果:addVertex(mappedSourceV);
结果:addVertex(mappedTargetV);
DefaultWeightedEdge ee=result.addEdge(mappedSourceV、mappedTargetV);
double EdgeWight=源。GetEdgeWight(e);
结果:设置EdgeWight(ee,EdgeWight);
});
返回结果;
}
我们是否可以通过添加一个边缘映射器,以一种功能性/通用性更强的方式实现这一点?在中查看了
clone()
之后,它实际上相当简单。我已经把完整的代码和一个小演示放在一个文件夹中
公共静态图形转换(图形源,函数vertexMapper){
图形结果=GraphTypeBuilder.forGraphType(source.getType()).buildGraph();
source.vertexSet().forEach(v->result.addVertex(vertexMapper.apply(v));
对于(E:source.edgeSet()){
Vv s=vertexMapper.apply(source.getEdgeSource(e));
Vv t=vertexMapper.apply(source.getEdgeTarget(e));
结果:添加顶点;
结果:addVertex(t);
结果。添加(s、t、e);
}
返回结果;
}
您好,请查看我的最新编辑好吗?
public static <V, Vv, E> Graph<Vv, E> convert(Graph<V, E> source, Function<V, Vv> vertexMapper) {
Graph<Vv, E> result = GraphTypeBuilder.<Vv, E>forGraphType(source.getType()).buildGraph();
source.vertexSet().forEach(v -> result.addVertex(vertexMapper.apply(v)));
for (E e : source.edgeSet()) {
Vv s = vertexMapper.apply(source.getEdgeSource(e));
Vv t = vertexMapper.apply(source.getEdgeTarget(e));
result.addVertex(s);
result.addVertex(t);
result.addEdge(s, t, e);
}
return result;
}