如何在JUNG中添加具有相同标签(但不同端点)的两条边?

如何添加具有相同标签但不同端点的两条边?

例如,我想添加两个具有相同标签’label1’的边,一个从顶点v-1到顶点v-2,另一个从顶点v-2到v-3。

部分代码是:

g.addEdge("label1","v-1","v-2"); g.addEdge("label1","v-2","v-3"); 

但是JUNG不允许添加具有相同标签的两条边。 它给出了一个错误:

edge label1已存在于此图中,端点为[v-1,v-2],无法添加端点[v-2,v-3]

如何添加具有相同标签的两条边?

谢谢。

编辑:

我刚刚读到有一种方法可以为边缘分配权重值,即使用EdgeWeightLabeller ,但这些权重值应该是整数。 所以它似乎没有解决问题。

标签不一定是边的toString(); 这只是默认值。 查看PluggableRendererContext,了解如何提供为图的每个元素提供属性的Transformer。

我还要查看JUNG 2手册(维基上)中有关用户数据的部分: http : //sourceforge.net/apps/trac/jung/wiki/JUNGManual#UserData

当我遇到这个问题时,我创建了我的标签String(你已经是一个String),并将其值设置为:“ID_OF_FIRST_VERTEX:ID_OF_SECOND_VERTEX:EDGE_VALUE”。 然后,为了显示一个值,我确实使用转换。 它很简单,它只是从edge的名字中获取edge_value。

在此示例中,我使用了分隔符“:”。

 VisualizationViewer vv = new VisualizationViewer(layout, dim); //other operations vv.getRenderContext().setEdgeLabelTransformer(new Transformer() { @Override public String transform(String c) { return StringUtils.substringAfterLast(c, ":"); } }); 

当然你不必使用Apache Commons的StringUtils,普通的String.subString也适用于此。

希望能帮助到你。

这是一个MCVE示例。

 package stackoverflow; import javax.swing.JFrame; import org.apache.commons.collections15.Transformer; import edu.uci.ics.jung.algorithms.layout.FRLayout; import edu.uci.ics.jung.graph.DirectedSparseMultigraph; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.visualization.VisualizationViewer; public class JungNetwork { public static Graph getGraph() { Graph g = new DirectedSparseMultigraph(); g.addVertex("v1"); g.addVertex("v2"); g.addVertex("v3"); g.addEdge("label1", "v1", "v2"); g.addEdge("label2", "v2", "v3"); g.addEdge("label3", "v3", "v1"); return g; } public static void main(String[] args) { JFrame f = new JFrame(); final Graph g = getGraph(); VisualizationViewer vv = new VisualizationViewer(new FRLayout(g)); final Transformer  edgeLabel = new Transformer(){ @Override public String transform(String edge) { // TODO Auto-generated method stub if (edge.equals("label1")|| edge.equals("label2")){ return "label1"; }else return "label3"; } }; vv.getRenderContext().setLabelOffset(15); vv.getRenderContext().setEdgeLabelTransformer(edgeLabel); f.getContentPane().add(vv); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } } 

结果:

在此处输入图像描述