Java: .equals () falhar para conjuntos (JGraphT)
Pergunta
Eu não posso descobrir o que está acontecendo de errado aqui. Este teste falhar:
@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;
}
O depurador mostra que o método decide que os dois conjuntos de vértices e conjuntos de ponta não são iguais, então ele retorna false. Como isso é possível?
Nota lateral: Eu estou tentando escrever um cheque igualdade para gráficos JGraphT. Como é possível que isso não foi feito?
UPDATE: Eu acho que DefaultWeightedEdge não sobrescrever equals, de modo que não iria funcionar. Eu fiz uma maneira diferente de verificar se existem arestas entre todos os vértices necessários, e agora parece ao trabalho.
Solução
De acordo com a DefaultWeightedEdge
o JavaDoc ainda não implementado equals()
e hashCode()
e, portanto, utiliza os métodos definidos em java.lang.Object
. Isto significa que dois DefaultWeightedEdge
objetos a
e b
com os mesmos valores não retorno true
de a.equals(b)
. Isso só iria true
retornar se a
e b
realmente se referem ao mesmo objeto.
Você precisa usar uma classe de implementação de ponta que implementos .equals()
e hashCode()
para obter resultados úteis aqui.
Outras dicas
Eu não estou familiarizado com JGraphT, mas há duas questões que eu posso pensar.
Em primeiro lugar, o que significa isso para dois conjuntos de bordas para ser equivalente? O que é que faz duas bordas equivalente? Se eu criar um gráfico, e criar um gráfico idêntico separadamente, tanto pode ter a mesma estrutura. Mas se a comparação beira de duas bordas correspondentes usa as identidades do nó, as duas bordas não seria "igual".
Em segundo lugar, eu tenho notado isso nas JavaDocs:
"A implementação gráfico pode manter uma ordenação especial conjunto (por exemplo, através LinkedHashSet) para a iteração determinista, mas isso não é necessário. É da responsabilidade de chamadores que dependem desse comportamento para apenas implementações gráfico de uso que a apoiam."
Gostaria de tentar (pelo menos para a sanidade) para se certificar de que os dois conjuntos contêm um do outro, como é possível que iguala não é implementada corretamente (por exemplo, pode demorar fim em conta).