2 つの jgraphT インスタンスを単純に等しくしようとしましたが、それらが同一であっても false を返します。次に、私の実装で equals をオーバーライドしようとしました。
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() メソッドもオーバーライドする必要がありました。現在、これは頂点では機能しましたが、エッジではハッシュコードで null ポインター例外が発生しました。これは私のオーバーライドされたメソッドです。
@Override
public int hashCode() {
return (getSource().hashCode()+getTarget().hashcode());
}
グラフにエッジを作成しようとすると、null ポインターが返されます (ここで hashcode() が呼び出されると思います)。
myGraph.addEdge(a,b);
問題は、 getSource() と getTarget() がその瞬間に呼び出されたときに null を返すように見えることです...どうすれば解決できますか? これは例外スタックです:
スレッド「メイン」での例外 java.util.HashMap.hash(HashMap.java:366) での org.at.network.types.CustomE.hashCode(CustomE.java:71) での java.lang.NullPointerException。 org.jgrapht.graph.AbstractBaseGraph.containsEdge(AbstractBaseGraph.java:359) で java.util.HashMap.containsKey(HashMap.java:453) で HashMap.getEntry(HashMap.java:466) org.jgrapht.graph.AbstractBaseGraph でorg.jgrapht.graph.GraphDelegator.addEdge(GraphDelegator.java:131) の .addEdge(AbstractBaseGraph.java:208) org.jgrapht.graph.DefaultListenableGraph.addEdge(DefaultListenableGraph.java:162) の org.at.network。 types.MyGraph.addCustomEdge(MyGraph.java:27) at 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;
}
ポートは、いくつかの文字列の単純なデータ構造です。