【问题标题】:How to map jgrapht Graph<Foo,E> to another Graph<Bar,E>?如何将 jgrapht Graph<Foo,E> 映射到另一个 Graph<Bar,E>?
【发布时间】:2020-11-06 16:40:12
【问题描述】:

我有以下图表:

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

如何将其映射到类型为 Graph&lt;Bar, DefaultWeightedEdge&gt; 的图表?


我还添加了 Nikolais 答案映射边缘,因为它没有转换 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;

}

我们能否通过添加边缘映射器以更实用/更通用的方式做到这一点?

【问题讨论】:

    标签: java data-conversion jgrapht


    【解决方案1】:

    在查看clone() 中的AbstractBaseGraph 之后,它实际上相当简单。我已经把完整的代码和一个小演示放在了gist

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

    【讨论】:

    • 您好,请您查看我的最新编辑吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多