문제

여기서 무엇이 잘못되고 있는지 알 수 없습니다. 이 테스트는 실패합니다.

@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가 동일하게 무시하지 않으므로 작동하지 않을 것입니다. 나는 필요한 모든 정점 사이에 가장자리가 존재하는지 확인하는 다른 방법을 수행했으며 이제는 작동하는 것 같습니다.

도움이 되었습니까?

해결책

에 따르면 Javadoc DefaultWeightedEdge 구현되지 않았습니다 equals() 그리고 hashCode() 따라서 정의 된 방법을 사용합니다 java.lang.Object. 이것은 두 가지를 의미합니다 DefaultWeightedEdge 사물 a 그리고 b 같은 값으로 ~ 아니다 반품 true ~에서 a.equals(b). 그것은 단지 돌아올 것입니다 true 만약에 a 그리고 b 실제로 같은 개체를 참조하십시오.

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

다른 팁

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

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

둘째, 나는 이것을 Javadocs에서 언급했다.

"그래프 구현은 결정 론적 반복을위한 특정 세트 순서 (예 : LinkedHashset을 통한)를 유지할 수 있지만, 이는 필요하지 않습니다.이 동작에 의존하는 발신자의 책임은이를 지원하는 그래프 구현 만 사용하는 책임입니다."

나는 평등이 올바르게 구현되지 않을 수 있으므로 두 세트에 서로를 포함하는지 확인하려고 노력할 것이다 (예 : 순서가 고려 될 수 있음).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top