作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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
中可能是有意义的类也是如此。然后你可以实现 equals
和 hashCode
方法允许您在两条边具有相同顶点时将它们视为相等。
关于java - JUNG2如何绘制相同的边名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495517/
我是一名优秀的程序员,十分优秀!