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가 동일하게 무시하지 않으므로 작동하지 않을 것입니다. 나는 필요한 모든 정점 사이에 가장자리가 존재하는지 확인하는 다른 방법을 수행했으며 이제는 작동하는 것 같습니다.
해결책
에 따르면 Javadoc DefaultWeightedEdge
구현되지 않았습니다 equals()
그리고 hashCode()
따라서 정의 된 방법을 사용합니다 java.lang.Object
. 이것은 두 가지를 의미합니다 DefaultWeightedEdge
사물 a
그리고 b
같은 값으로 ~ 아니다 반품 true
~에서 a.equals(b)
. 그것은 단지 돌아올 것입니다 true
만약에 a
그리고 b
실제로 같은 개체를 참조하십시오.
구현하는 Edge 구현 클래스를 사용해야합니다. .equals()
그리고 hashCode()
여기에서 유용한 결과를 얻으려면.
다른 팁
나는 Jgrapht에 익숙하지 않지만 내가 생각할 수있는 두 가지 문제가 있습니다.
첫째, 두 개의 가장자리 세트가 동등한 것은 무엇을 의미합니까? 두 개의 가장자리를 동등하게 만드는 것은 무엇입니까? 그래프를 만들고 동일한 그래프를 별도로 만들면 둘 다 동일한 구조를 가질 수 있습니다. 그러나 두 개의 일치하는 가장자리의 모서리 비교가 노드 아이덴티티를 사용하면 두 모서리가 "동일"하지 않습니다.
둘째, 나는 이것을 Javadocs에서 언급했다.
"그래프 구현은 결정 론적 반복을위한 특정 세트 순서 (예 : LinkedHashset을 통한)를 유지할 수 있지만, 이는 필요하지 않습니다.이 동작에 의존하는 발신자의 책임은이를 지원하는 그래프 구현 만 사용하는 책임입니다."
나는 평등이 올바르게 구현되지 않을 수 있으므로 두 세트에 서로를 포함하는지 확인하려고 노력할 것이다 (예 : 순서가 고려 될 수 있음).