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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top