我试图简单地等于两个 jgraphT 实例,它返回 false,即使它们是相同的。然后我尝试用我的实现覆盖等号:
public boolean equals(MyGraph<CustomV, CustomE> otherGraph){
boolean result = true;
Iterator<CustomV> vertexes = otherGraph.vertexSet().iterator();
while(result && vertexes.hasNext()){
result = this.containsVertex((V) vertexes.next());
}
Iterator<CustomE> edges = otherGraph.edgeSet().iterator();
while(result && edges.hasNext())
result = this.containsEdge((E) edges.next());
return result;
}
并看到如果该边不是 EXACT 对象,则 containsEdge() 方法将失败。这很奇怪,因为我确保覆盖边缘和开关的 equals 方法......
编辑:做了这个实验:
CustomV aNode = new CustomV(1,2);
myGraph.addVertex(aNode);
System.out.println(myGraph.containsVertex(aNode)); //true
System.out.println(myGraph.containsVertex(new CustomV(1,2))); //false..but should be true
如您所见, containsVertex() 方法似乎不起作用..
edit2:感谢愚蠢的怪胎,我几乎解决了:我也必须覆盖 hashcode() 方法。现在,这适用于顶点,但对于边缘,我在哈希码上得到一个空指针异常,这是我重写的方法:
@Override
public int hashCode() {
return (getSource().hashCode()+getTarget().hashcode());
}
当我尝试在图上创建一条边时,我得到一个空指针(我想这里调用了 hashcode()):
myGraph.addEdge(a,b);
问题是 getSource() 和 getTarget() 在那一刻调用时似乎返回 null ......如何解决?这是异常堆栈:
java.util.HashMap.hash(HashMap.java:366) 的 org.at.network.types.CustomE.hashCode(CustomE.java:71) 的线程“main”java.lang.NullPointerException 异常。 HashMap.getEntry(HashMap.java:466) at java.util.HashMap.containsKey(HashMap.java:453) at org.jgrapht.graph.AbstractBaseGraph.containsEdge(AbstractBaseGraph.java:359) at org.jgrapht.graph.AbstractBaseGraph org.jgrapht.graph.DefaultListenableGraph.addEdge(DefaultListenableGraph.java:162) 在 org.at.network 的 org.jgrapht.graph.GraphDelegator.addEdge(GraphDelegator.java:131) 的 .addEdge(AbstractBaseGraph.java:208)。 types.MyGraph.addCustomEdge(MyGraph.java:27) 在 org.at.network.Test.main(Test.java:220)
addcustomedge 方法如下:
public CustomE addCustomEdge(V sourceVertex, Port sourcePort,
V targetVertex, Port targetPort){
CustomE l = (CustomE)super.addEdge(sourceVertex, targetVertex);
l.setSourceP(sourcePort);
l.setTargetP(targetPort);
return l;
}
端口只是几个字符串的简单数据结构。