这个问题显然缺乏细节,但从描述和错误消息中,人们可能会猜到这里出了什么问题:
您的图表可能被定义为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
andhashCode
方法,当它们具有相同的顶点时,您可以将它们视为相等的。