2009-11-26 6 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가 equals를 대체하지 않기 때문에 작동하지 않습니다. 저는 모든 꼭지점 사이에 모서리가 있는지 확인하는 다른 방법을 사용했습니다. 이제는 작동하는 것처럼 보입니다. the JavaDocDefaultWeightedEdge 따르면

+0

'Graph.edgeSet'의 유형은 무엇입니까? –

+0

Java.util.Set

답변

2

equals()hashCode() 구현함으로써 java.lang.Object에 기재된 방법을 사용하지 않았다. 즉, 동일한 값을 갖는 두 DefaultWeightedEdge 개체 ab이 아니며truea.equals(b)에서 반환됩니다. ab이 실제로 동일한 객체를 참조하는 경우에만 true을 반환합니다.

여기서 유용한 결과를 얻으려면 .equals()hashCode()을 구현하는 가장자리 구현 클래스를 사용해야합니다.

+0

그래, 그게 내가 알아 낸거야. 그러한 구현을 염두에두고 있습니까? –

0

저는 JGraphT에 익숙하지 않지만 생각할 수있는 두 가지 문제가 있습니다.

첫째, 두 세트의 가장자리가 동일하다는 것은 무엇을 의미합니까? 두 개의 가장자리를 동일하게 만드는 것은 무엇입니까? 그래프를 만들고 별도로 동일한 그래프를 만들면 둘 다 같은 구조를 가질 수 있습니다. 그러나 두 일치 에지의 에지 비교가 노드 ID를 사용하면 두 에지가 "동일"하지 않습니다.

둘째, 나는 JavaDoc을이 지적했습니다

"이 필요하지 않습니다 (예를 통해 LinkedHashSet의) 결정적 반복에 대한, 특정 세트의 순서를 유지할 수 그래프 구현 그것은 호출자의 책임이다. 누가이 동작을 지원하는 그래프 구현만을 사용 하느냐 "고 말했다.

두 세트가 서로 포함되어 있는지 확인하기 위해 노력할 것입니다. equals가 올바르게 구현되지 않았을 가능성이 있습니다 (예 : 주문이 고려 될 수 있음).