2009-11-26 73 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)爲確定性的迭代,但不是必需的,是呼叫者的責任。誰依賴這種行爲只能使用支持它的圖形實現。「

我會嘗試(至少爲了理智)來確保兩個集合包含對方,因爲有可能等於沒有正確實現(例如,它可能會考慮順序)。