2009-11-26 67 views
0

我无法弄清楚这里出了什么问题。此测试失败: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; 
} 

调试器示出该方法决定两个顶点集和边缘集是不相等的,所以它返回false。这怎么可能?

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

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

+0

'Graph.edgeSet'的类型是什么? – 2009-11-26 23:59:15

+0

Java.util.Set 2009-11-27 00:01:50

回答

2

根据the JavaDocDefaultWeightedEdge尚未实施equals()hashCode(),因此使用java.lang.Object中定义的方法。这意味着两个DefaultWeightedEdge对象ab具有相同的值将而不是返回truea.equals(b)。如果ab实际上指的是同一个对象,那只会返回true

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

+0

是的,这就是我想到的。你是否有这样的实现? – 2009-11-27 00:11:27

0

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

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

其次,我在JavaDoc中指出这一点:

“的图实现可维持一组特定的顺序(例如,通过LinkedHashSet)为确定性的迭代,但不是必需的,是呼叫者的责任。谁依赖这种行为只能使用支持它的图形实现。“

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