如何添加具有相同标签但不同端点的两条边?
例如,我想添加两个具有相同标签'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,但这些权重值应该是整数。所以它似乎没有解决问题。
答案 0 :(得分:1)
标签不一定是边的toString();这只是默认值。看一下PluggableRendererContext,看看如何提供一个为图形的每个元素提供属性的Transformer。
我还会查看JUNG 2手册(维基上)中有关用户数据的部分:http://sourceforge.net/apps/trac/jung/wiki/JUNGManual#UserData
答案 1 :(得分:1)
当我遇到这个问题时,我将我的标签字符串(你已经是一个字符串)并使其值如下:“ID_OF_FIRST_VERTEX:ID_OF_SECOND_VERTEX:EDGE_VALUE”。然后,为了只显示一个值,我确实使用了转换。它很简单,只需要从边缘名称获取edge_value。
在此示例中,我使用了分隔符“:”。
VisualizationViewer vv = new VisualizationViewer(layout, dim);
//other operations
vv.getRenderContext().setEdgeLabelTransformer(new Transformer<String, String>() {
@Override
public String transform(String c) {
return StringUtils.substringAfterLast(c, ":");
}
});
当然你不必使用Apache Commons的StringUtils,普通的String.subString也适用于此。
希望它有所帮助。
答案 2 :(得分:0)
以下是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<String, String> getGraph()
{
Graph<String, String> g = new DirectedSparseMultigraph<String, String>();
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<String, String> g = getGraph();
VisualizationViewer<String, String> vv = new VisualizationViewer<String, String>(new FRLayout<String, String>(g));
final Transformer <String, String> edgeLabel = new Transformer<String, String>(){
@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);
}
}
结果: