Java:.equals()がセットに対して失敗する(JGraphT)
質問
ここで何が間違っているのかわかりません。このテストは失敗します:
@Test
public void testSimpleCase() {
assertTrue(JGraphtUtilities.graphEquality(ChooseRootTest.generateSimpleCaseGraph(), ChooseRootTest.generateSimpleCaseGraph()));
}
public static <V, E> boolean graphEquality(Graph<V, E> g0, Graph<V, E> g1) {
boolean result = true;
if (g0.edgeSet().equals(g1.edgeSet()) && g0.vertexSet().equals(g1.vertexSet())) {
for (E e : g0.edgeSet()) {
if (g0.getEdgeWeight(e) != g1.getEdgeWeight(e)) {
result = false;
}
}
}
else {
return false; //for the above test, this is what is returned
}
return result;
}
デバッガーは、メソッドが2つの頂点セットとエッジセットが等しくないと判断することを示しているため、falseを返します。これはどのように可能ですか?
補足:JGraphTグラフの等価性チェックを作成しようとしています。まだこれが行われていない可能性はありますか?
更新: DefaultWeightedEdgeはequalsをオーバーライドしないので、機能しません。必要なすべての頂点間にエッジが存在することを確認する別の方法を実行しましたが、今では機能しているようです。
解決
JavaDoc DefaultWeightedEdge
は equals()
および hashCode()
を実装していないため、 java.lang.Object
で定義されているメソッドを使用します。つまり、同じ値を持つ2つの DefaultWeightedEdge
オブジェクト a
および b
は、 true を返しません true
a.equals(b)
のcode>。 a
と b
が実際に同じオブジェクトを参照している場合にのみ、 true
を返します。
ここで有用な結果を得るには、 .equals()
および hashCode()
を実装するエッジ実装クラスを使用する必要があります。
他のヒント
私はJGraphTに精通していませんが、考えられる問題が2つあります。
まず、2組のエッジが同等であるとはどういう意味ですか? 2つのエッジを同等にするのは何ですか?グラフを作成し、同一のグラフを個別に作成すると、両方が同じ構造を持つ場合があります。ただし、2つの一致するエッジのエッジ比較でノードIDを使用する場合、2つのエッジは「等しい」とはなりません。
次に、JavaDocsでこれを書きました:
&quot;グラフの実装は、確定的な反復のために特定のセットの順序を維持する場合があります(たとえば、LinkedHashSetを介して)が、これは必須ではありません。この動作に依存する呼び出し側は、それをサポートするグラフ実装のみを使用する責任があります。&quot;
(少なくとも正気のために)equalsが正しく実装されていない可能性があるため、2つのセットにお互いが含まれていることを確認します(たとえば、順序を考慮に入れる可能性があります)。