Вопрос

Я не могу понять, что здесь происходит не так. Этот тест не пройден:

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

Отладчик показывает, что метод решает, что два набора вершин и наборы ребер не равны, поэтому он возвращает false. Как это возможно?

Примечание: я пытаюсь написать проверку на равенство для графов JGraphT. Как это возможно, что это еще не было сделано?

ОБНОВЛЕНИЕ . Я думаю, что DefaultWeightedEdge не переопределяет equals, так что это не сработает. Я сделал другой способ проверки существования ребер между всеми необходимыми вершинами, и теперь, похоже, это работает.

Это было полезно?

Решение

Согласно JavaDoc DefaultWeightedEdge не реализовал equals () и hashCode () и поэтому использует методы, определенные в java.lang.Object . Это означает, что два объекта DefaultWeightedEdge a и b с одинаковыми значениями не вернут true from a.equals (b) . Это вернет true , только если a и b действительно ссылаются на один и тот же объект.

Чтобы получить полезные результаты, вам нужно использовать класс реализации края, который реализует .equals () и hashCode () .

Другие советы

Я не знаком с JGraphT, но есть две проблемы, о которых я могу подумать.

Во-первых, что означает, что два набора ребер эквивалентны? Что делает два ребра эквивалентными? Если я создаю граф и создаю идентичный граф отдельно, оба могут иметь одинаковую структуру. Но если сравнение ребер двух совпадающих ребер использует идентификаторы узлов, эти два ребра не будут "равными".

Во-вторых, я отметил это в JavaDocs:

" реализация графа может поддерживать конкретный порядок набора (например, через LinkedHashSet) для детерминированной итерации, но это не требуется. Вызывающие, которые полагаются на это поведение, обязаны использовать только те реализации графов, которые его поддерживают. & Quot;

Я бы постарался (по крайней мере, для здравого смысла) убедиться, что два набора содержат друг друга, так как возможно, что equals не реализован правильно (например, это может принять во внимание порядок).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top