Pregunta

No puedo entender qué está pasando aquí. Esta prueba falla:

@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;
}

El depurador muestra que el método decide que los dos conjuntos de vértices y los conjuntos de bordes no son iguales, por lo que devuelve falso. ¿Cómo es esto posible?

Nota al margen: estoy tratando de escribir un control de igualdad para los gráficos JGraphT. ¿Cómo es posible que esto no se haya hecho ya?

ACTUALIZACIÓN: creo que DefaultWeightedEdge no anula iguales, por lo que eso no funcionaría. Hice una forma diferente de verificar que existen bordes entre todos los vértices necesarios, y ahora parece funcionar.

¿Fue útil?

Solución

De acuerdo con JavaDoc DefaultWeightedEdge no ha implementado equals () y hashCode () y, por lo tanto, utiliza los métodos definidos en java.lang.Object . Esto significa que dos DefaultWeightedEdge objetos a y b con los mismos valores no devolverán true de a.equals (b) . Eso solo devolvería true si a y b realmente se refieren al mismo objeto.

Debe usar una clase de implementación de borde que implemente .equals () y hashCode () para obtener resultados útiles aquí.

Otros consejos

No estoy familiarizado con JGraphT, pero hay dos problemas en los que puedo pensar.

Primero, ¿qué significa que dos conjuntos de aristas sean equivalentes? ¿Qué es lo que hace dos bordes equivalentes? Si creo un gráfico y creo un gráfico idéntico por separado, ambos pueden tener la misma estructura. Pero si la comparación de bordes de dos bordes coincidentes usa las identidades de nodo, los dos bordes no serían "iguales".

Segundo, he notado esto en los JavaDocs:

" La implementación del gráfico puede mantener un orden de conjunto particular (por ejemplo, a través de LinkedHashSet) para la iteración determinista, pero esto no es necesario. Es responsabilidad de las personas que llaman que confían en este comportamiento usar solo implementaciones de gráficos que lo admitan.

Intentaría (al menos por cordura) asegurarme de que los dos conjuntos se contienen entre sí, ya que es posible que igual no se implemente correctamente (por ejemplo, puede tener en cuenta el orden).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top