Java:.equals()集合失败(JGraphT)

时间:2009-11-26 23:57:15

标签: java set 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;
}

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

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

UPDATE:我认为DefaultWeightedEdge不会覆盖等于,所以这不起作用。我做了一种不同的方法来检查所有必要顶点之间是否存在边缘,现在它似乎有效。

2 个答案:

答案 0 :(得分:2)

根据the JavaDoc DefaultWeightedEdge尚未实施equals()hashCode(),因此使用java.lang.Object中定义的方法。这意味着具有相同值的两个DefaultWeightedEdge对象abtrue返回a.equals(b)。如果truea实际引用相同的对象,则只返回b

您需要使用实现.equals()hashCode()的边缘实现类来获取有用的结果。

答案 1 :(得分:0)

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

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

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

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

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