gpt4 book ai didi

java - JUNG2如何绘制相同的边名

转载 作者:行者123 更新时间:2023-11-29 05:05:35 25 4
gpt4 key购买 nike

我正在用 JUNG2 做一个绘制网络拓扑项目,现在发现 JUNG2 不能在不同的顶点上绘制相同的边(名称)。报告如下:

Exception in thread "main" java.lang.IllegalArgumentException: edge GigabitEthernet0/3<--->GigabitEthernet0/0/0/0 already exists in this graph with endpoints <HKBR1, HKBR3> and cannot be added with endpoints <HKBR2, HKBR4>
at edu.uci.ics.jung.graph.AbstractGraph.getValidatedEndpoints(AbstractGraph.java:93)
at edu.uci.ics.jung.graph.SparseMultigraph.addEdge(SparseMultigraph.java:123)
at edu.uci.ics.jung.graph.AbstractGraph.addEdge(AbstractGraph.java:60)
at pkg.DrawnTopology.DrawnTopology(DrawnTopology.java:45)
at pkg.ReadLine.main(ReadLine.java:85)

我已将所有边和顶点存储到一个二维数组中。二维数组数据从不同的文件中学习,所以数据是动态的。由于网络拓扑可能具有相同的边名称,那么如何解决?

最佳答案

这个问题显然缺乏细节,但是从描述和错误消息中,人们大概可以猜到这里出了什么问题:

您的图表可能被定义为 Graph<V, String> .

可能是Graph的子类, 顶点类型无关紧要。关键是边缘类型是String )

并且您正在尝试像这样向图中添加边:

g.addEdge("edge0", v0, v1);
g.addEdge("edge0", v2, v3);

这会导致错误,因为边"edge0"存在两次。 (这是有道理的。否则:当您向图形询问 "edge0" 的端点时会发生什么?它应该返回 v0,v1 还是 v2,v3?这简直是模棱两可)。

(请注意,这不仅是边类型为 String 的情况。任何 边类型都会发生这种情况,只要两条边彼此为 equal 即可)。

这里一个简单的解决方案是引入专用的 Edge包装字符串的类:

class Edge
{
private final String name;

Edge(String name)
{
this.name = name;
}

@Override
public String toString()
{
return name;
}
}

这个类没有有它的equals方法被覆盖。所以这种类型的两个对象将相等,即使字符串相等也是如此:

Edge e0 = new Edge("edge0");
Edge e1 = new Edge("edge0");
System.out.println(e0.equals(e1)); // prints "false"

然后边缘标签可以简单地是 toString这些边的表示,返回原始字符串。

一个例子:

import javax.swing.JFrame;

import org.apache.commons.collections15.Transformer;

import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;

class Edge
{
private final String name;

Edge(String name)
{
this.name = name;
}

@Override
public String toString()
{
return name;
}
}

public class JungDuplicateEdgesTest
{
public static void main(String[] args)
{
JFrame jf = new JFrame();
final Graph<String, Edge> g = getGraph();
VisualizationViewer<String, Edge> vv =
new VisualizationViewer<String, Edge>(
new FRLayout<String, Edge>(g));

class EdgeLabelTransformer implements Transformer<Edge, String>
{
@Override
public String transform(Edge edge)
{
return edge.toString();
}
}
vv.getRenderContext().setEdgeLabelTransformer(
new EdgeLabelTransformer());

jf.getContentPane().add(vv);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}

public static Graph<String, Edge> getGraph()
{
Graph<String, Edge> g = new DirectedSparseGraph<String, Edge>();
g.addVertex("v0");
g.addVertex("v1");
g.addEdge(new Edge("e0"), "v0", "v1");
g.addEdge(new Edge("e0"), "v1", "v0");
return g;
}
}

旁注:对于某些应用程序,将边的顶点存储在 Edge 中可能是有意义的类也是如此。然后你可以实现 equalshashCode方法允许您在两条边具有相同顶点时将它们视为相等。

关于java - JUNG2如何绘制相同的边名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com