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;
}

调试器显示该方法确定两个顶点集和边集不相等,因此返回 false。这怎么可能?

旁注:我正在尝试为 JGraphT 图编写相等检查。这怎么可能还没有完成?

更新:我认为 DefaultWeightedEdge 不会覆盖等于,所以那是行不通的。我做了一种不同的方法来检查所有必要顶点之间是否存在边,现在它似乎可以工作了。

4

2 回答 2

2

根据JavaDoc DefaultWeightedEdge尚未实现equals()hashCode()因此使用java.lang.Object. 这意味着两个具有相同值的DefaultWeightedEdge对象不会从. 只有当并且实际上引用同一个对象时才会返回。abtruea.equals(b)trueab

您需要使用一个边缘实现类来实现.equals()hashCode()在此处获得有用的结果。

于 2009-11-27T00:05:22.343 回答
0

我不熟悉 JGraphT,但我能想到两个问题。

首先,两组边相等是什么意思?是什么使两条边相等?如果我创建一个图,并分别创建一个相同的图,那么两者可能具有相同的结构。但是,如果两条匹配边的边比较使用节点标识,则两条边将不“相等”。

其次,我在 JavaDocs 中注意到了这一点:

“图实现可以为确定性迭代维护特定的集合排序(例如通过 LinkedHashSet),但这不是必需的。依赖此行为的调用者有责任仅使用支持它的图实现。”

我会尝试(至少为了理智)确保这两个集合相互包含,因为 equals 可能没有正确实现(例如,它可能会考虑顺序)。

于 2009-11-27T00:05:55.243 回答