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

Posted

技术标签:

【中文标题】如何在 JUNG 中添加具有相同标签(但端点不同)的两条边?【英文标题】:How to add two edges having the same label (but different endpoints) in JUNG? 【发布时间】:2012-03-10 06:51:56 【问题描述】:

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

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

部分代码是:

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

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

边 label1 已经存在于该图中,端点为 [v-1, v-2] 并且不能 添加端点 [v-2, v-3]

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

谢谢。

编辑:

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

【问题讨论】:

你能在第二条边上加一个空格吗? "label1 " 谢谢乔普·埃根。这真是个好主意!它解决了两条边的问题,这就是我在这里提出的问题:) 但为了简单起见,我要求两条边。实际上我会得到很多这样的优势。所以我不知道如果我为每个这样的边缘标签添加一个空格,我的图表会是什么样子。无论如何,再次感谢您的想法。 仅凭名称搜索顶点或边会很困难。如果您想要两个以上具有相同标签名称的顶点会发生什么?你会追加更多的空格吗?我不这么认为。您如何定义一个包含几个字段的自定义 Java 类(用户数据);一个字段用于唯一 ID,一个字段用于其名称;将此类应用为通用顶点部分(您可以对通用边缘部分执行相同操作,但使用另一个自定义类)。使用vertexLabelTransformer()显示类实例的名称部分,但使用唯一id进行搜索等。 【参考方案1】:

这是一个MCVE 示例。

package ***;

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




结果:

【讨论】:

【参考方案2】:

当我遇到这个问题时,我将我的标签设为字符串(你已经是字符串)并将其值设为:“ID_OF_FIRST_VERTEX:ID_OF_SECOND_VERTEX: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 也可以在这里工作。

希望对您有所帮助。

【讨论】:

【参考方案3】:

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

我还会查看 JUNG 2 手册(在 wiki 上)中讨论用户数据的部分:http://sourceforge.net/apps/trac/jung/wiki/JUNGManual#UserData

【讨论】:

谢谢约书亚!我很高兴有一种方法。我仍在学习这些变压器。我会试试你的建议。

以上是关于如何在 JUNG 中添加具有相同标签(但端点不同)的两条边?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SAX 解析器,如何解析具有相同名称标签但元素不同的 xml 文件?

JUNG:我们如何根据顶点的一些属性进行图聚类?

如何拥有两个具有不同命名空间和相同 JAXB 类的不同端点?

请检查具有相同名称的管道是不是先前已提交到不同的端点

在运行时更改服务引用端点,有时会使用错误的端点

JUNG 图可视化中的顶点标签