Java: .equals () не работает для множеств (JGraphT) - PullRequest
0 голосов
/ 27 ноября 2009

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

@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 не переопределяет равно, так что это не будет работать. Я сделал другой способ проверки существования ребер между всеми необходимыми вершинами, и теперь, похоже, это работает.

Ответы [ 2 ]

2 голосов
/ 27 ноября 2009

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

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

0 голосов
/ 27 ноября 2009

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

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

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

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

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

...