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;
}