Question

Je ne peux pas comprendre ce qui ne va pas ici. Ce test échoue:

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

Le débogueur montre que la méthode décide que les deux ensembles de sommets et les ensembles de bords ne sont pas égaux. Par conséquent, il renvoie false. Comment est-ce possible?

Note latérale: J'essaie d'écrire un contrôle d'égalité pour les graphes JGraphT. Comment est-il possible que cela ne soit pas déjà fait?

UPDATE: , je pense que DefaultWeightedEdge ne remplace pas l'égalité, ce qui ne fonctionnerait pas. J'ai fait une autre manière de vérifier qu'il existe des arêtes entre tous les sommets nécessaires, et maintenant, cela semble fonctionner.

Était-ce utile?

La solution

Selon le JavaDoc DefaultWeightedEdge n'a pas implémenté equals () et hashCode () et utilise donc les méthodes définies dans java.lang.Object . Cela signifie que deux objets DefaultWeightedEdge a et b ayant les mêmes valeurs ne ne renverront pas true dans a.equals (b) . Cela renverrait uniquement true si a et b font en réalité référence au même objet.

Vous devez utiliser une classe d'implémentation Edge qui implémente .equals () et hashCode () pour obtenir des résultats utiles ici.

Autres conseils

Je ne connais pas JGraphT, mais je peux penser à deux choses.

Premièrement, qu'est-ce que cela signifie pour que deux jeux d'arêtes soient équivalents? Qu'est-ce qui fait que deux bords sont équivalents? Si je crée un graphique et que je crée un graphique identique séparément, les deux peuvent avoir la même structure. Mais si la comparaison d’arêtes de deux arêtes correspondantes utilise les identités de nœud, les deux arêtes ne seraient pas "égales".

Deuxièmement, j'ai noté ceci dans les JavaDocs:

"L'implémentation de graphique peut conserver un ordre de jeu particulier (par exemple via LinkedHashSet) pour une itération déterministe, mais cela n'est pas obligatoire. Il est de la responsabilité des appelants qui s’appuient sur ce comportement d’utiliser uniquement les implémentations graphiques qui le prennent en charge. "

J'essaierais (du moins pour des raisons de santé mentale) de m'assurer que les deux ensembles se contiennent l'un l'autre, car il est possible qu'égal ne soit pas implémenté correctement (par exemple, cela peut prendre en compte l'ordre).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top