Как добавить два ребра, имеющих одинаковую метку (но разные конечные точки) в JUNG? - PullRequest
3 голосов
/ 19 февраля 2012

Как добавить два ребра, имеющие одинаковую метку, но разные конечные точки?

Например, я хочу добавить два ребра, имеющие одинаковую метку 'label1', один от вершины v-1 до вершины v-2а другой от вершины v-2 до v-3.

Часть кода будет выглядеть следующим образом:

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

Но JUNG не позволяет добавлять два ребра с одинаковой меткой.Это выдает ошибку:

метка ребра1 уже существует в этом графе с конечными точками [v-1, v-2] и не может быть добавлена ​​с конечными точками [v-2, v-3]

Как добавить два ребра с одинаковой меткой?

Спасибо.

Редактировать:

Я только что прочитал, что есть способ назначитьзначение веса для ребра, то есть с помощью EdgeWeightLabeller , но эти значения веса должны быть целыми числами.Так что, похоже, не решить проблему.

Ответы [ 3 ]

1 голос
/ 31 мая 2013

Когда у меня возникает эта проблема, я создаю свой ярлык String (ваш - это уже String) и задаю его значение следующим образом: "ID_OF_FIRST_VERTEX: ID_OF_SECOND_VERTEX: EDGE_VALUE". Затем, чтобы отобразить только значение, я использую преобразование. Это просто, оно берет значение edge_value из имени edge.

В этом примере я использую разделитель ":".

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, ":");
    }
});

Конечно, вам не нужно использовать StringUtils от Apache Commons, здесь также будет работать обычная String.subString.

Надеюсь, это поможет.

1 голос
/ 20 февраля 2012

Метки не обязательно должны быть toString () ребер; это просто по умолчанию. Взгляните на PluggableRendererContext, чтобы узнать, как предоставить Transformer, который предоставляет свойство для каждого элемента графа.

Я бы также ознакомился с разделом руководства JUNG 2 (на вики), в котором говорится о пользовательских данных: http://sourceforge.net/apps/trac/jung/wiki/JUNGManual#UserData

0 голосов
/ 30 октября 2014

Вот пример 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);
}


}

Результат:

enter image description here

...