【发布时间】: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<Bar, DefaultWeightedEdge> 的图表?
我还添加了 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