Frage

ich kann nicht herausfinden, was falsch hier los ist. Dieser Test schlägt fehl:

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

Der Debugger zeigt, dass das Verfahren entscheidet, dass die zwei Eckenmengen und Kantensätze nicht gleich sind, so gibt es falsch. Wie ist das möglich?

Randbemerkung: Ich versuche, eine Gleichheitsprüfung für JGraphT Graphen zu schreiben. Wie ist es möglich, dass dies bereits nicht geschehen ist?

UPDATE: Ich denke, dass DefaultWeightedEdge nicht equals enthebt, so dass nicht funktionieren würde. Ich habe eine andere Art und Weise der Überprüfung, dass Kanten zwischen allen notwendigen Ecken vorhanden ist, und jetzt scheint es zu funktionieren.

War es hilfreich?

Lösung

Nach die JavaDoc DefaultWeightedEdge nicht umgesetzt hat equals() und hashCode() und daher verwendet die in java.lang.Object definierten Methoden. Das bedeutet, dass zwei DefaultWeightedEdge Objekte a und b mit den gleichen Werten werden nicht Rückkehr true von a.equals(b). Das würde nur zurückkehren, wenn true a und b tatsächlich auf das gleiche Objekt beziehen.

Sie benötigen einen Rand Implementierungsklasse zu verwenden, die .equals() und hashCode() implementiert nützliche Ergebnisse hier.

Andere Tipps

Ich bin nicht vertraut mit JGraphT, aber es gibt zwei Probleme, die ich denken kann.

Erstens, was bedeutet es für zwei Sätze von Kanten bedeutet äquivalent zu sein? Was ist es, dass zwei Kanten äquivalent macht? Wenn ich ein Diagramm erstellen, und erstellen Sie separat ein identisches Diagramm, beide könnten die gleiche Struktur haben. Aber wenn Kanten Vergleich von zwei passenden Kanten der Knotenidentitäten verwendet, die beiden Ränder wären nicht „gleich“.

Zweitens habe ich festgestellt, das in dem JavaDocs:

„Die Grafik Implementierung kann eine bestimmten Satz Bestellung (zB über LinkedHashSet) für deterministische Iteration erhalten, aber dies ist nicht erforderlich. Es liegt in der Verantwortung von Anrufern, die auf diesem Verhalten verlassen, um nur Graph-Implementierungen verwenden, die sie unterstützen.“

Ich würde versuchen, (zumindest für geistige Gesundheit), um sicherzustellen, dass die beiden Sätze sie enthalten, da es möglich ist, die nicht korrekt implementiert gleich ist (beispielsweise es um berücksichtigen kann).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top