首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.equals() sets失败(JGraphT)

.equals() sets失败(JGraphT)
EN

Stack Overflow用户
提问于 2009-11-26 23:57:15
回答 2查看 746关注 0票数 0

我不知道这里出了什么问题。此测试失败:

代码语言:javascript
复制
@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不覆盖等于,所以这是行不通的。我做了一种不同的方法来检查所有必要的顶点之间是否存在边,现在它似乎起作用了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-27 00:05:22

根据the JavaDoc的说法,DefaultWeightedEdge没有实现equals()hashCode(),因此使用了在java.lang.Object中定义的方法。这意味着两个具有相同值的DefaultWeightedEdge对象ab将从a.equals(b)返回true,而不是。只有当ab实际上引用同一个对象时,才会返回a

您需要使用实现.equals()hashCode()的边缘实现类在这里获得有用的结果。

票数 2
EN

Stack Overflow用户

发布于 2009-11-27 00:05:55

我不熟悉JGraphT,但有两个问题我可以考虑。

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

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

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

我会尝试确保这两个集合相互包含(至少对于理智而言是这样),因为可能不正确地实现相等(例如,它可能考虑到顺序)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1806184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档