0

ここで何が問題になっているのかわかりません。このテストは失敗します:

@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をオーバーライドしないので、機能しないと思います。必要なすべての頂点の間にエッジが存在することを確認する別の方法を実行しましたが、現在は機能しているようです。

4

2 に答える 2

2

JavaDoc によると、DefaultWeightedEdge実装されていないためequals()hashCode()で定義されたメソッドを使用しますjava.lang.Object。これは、同じ値を持つ2つのDefaultWeightedEdgeオブジェクトがから返されないことを意味します。これは、実際に同じオブジェクトを参照している場合にのみ返されます。abtruea.equals(b)trueab

.equals()ここで実装しhashCode()、有用な結果を得るには、エッジ実装クラスを使用する必要があります。

于 2009-11-27T00:05:22.343 に答える
0

私はJGraphTに精通していませんが、考えられる2つの問題があります。

まず、2セットのエッジが同等であるとはどういう意味ですか?2つのエッジを同等にするのは何ですか?グラフを作成し、同じグラフを別々に作成すると、両方が同じ構造になる可能性があります。ただし、一致する2つのエッジのエッジ比較でノードIDを使用する場合、2つのエッジは「等しく」なりません。

次に、JavaDocsでこれに注意しました。

「グラフの実装は、決定論的反復のために特定のセットの順序を維持する場合があります(たとえば、LinkedHashSetを介して)が、これは必須ではありません。この動作をサポートするグラフの実装のみを使用するのは、この動作に依存する呼び出し元の責任です。」

equalsが正しく実装されていない可能性があるため、(少なくとも正気のために)2つのセットが互いに含まれていることを確認しようとします(たとえば、順序が考慮される場合があります)。

于 2009-11-27T00:05:55.243 に答える