Как охарактеризовать ребра в DefaultDirectedGraph или JGraphT?

Я использую DefaultDirectedGraph для создания ориентированного графа, где каждая вершина является объектом.

DefaultDirectedGraph g = новый DefaultDirectedGraph(DefaultEdge.class);

Мне было интересно, можно ли охарактеризовать края? Например, я хотел бы сохранить информацию о дружбе между студентами.

Или у меня должна быть карта между краями и объектами дружбы?


person Mina Nabi    schedule 18.03.2018    source источник
comment
Не уверен, что вы просите. Graph‹Person, DefaultEdge›FriendlyGraph=new DefaultUndirectedGraph‹›(DefaultEdge.class); Добавьте несколько человек: friendGraph.addVertex (новый человек (Джефф)); ... Добавить отношения: friendGraph.addEdge(p1, p2); Чтобы узнать, есть ли у 2 человек отношения: friendGraph.containsEdge(p1,p2); Чтобы запросить все отношения: friendGraph.edgeSet();   -  person Joris Kinable    schedule 19.03.2018
comment
Я хочу сохранить некоторую информацию о границе между вершинами. (обратите внимание, что я использовал пример с учеником и дружбой только для того, чтобы прояснить свой вопрос. Хотя отношения дружбы не обязательно должны быть направленными, но в моей реальной проблеме край должен быть направленным. Допустим, я хочу сохранить информацию о том, как инициировано дружба и количество лет, в течение которых студенты дружат.) Я знаю, что в JgraphT вершинами может быть класс, такой как студент. Есть ли возможность определить класс и для ребер вместо использования класса DefaultEdge). Заранее спасибо.   -  person Mina Nabi    schedule 19.03.2018


Ответы (1)


Вы, конечно, можете хранить информацию на краях. Вот случай, который я недавно использовал сам:

public class Intersection{
    public final long latitude;
    public final long longitude;
    public Intersection(long latitude, long longitude){ ...}
}

public class Street extends DefaultWeightedEdge{
    public final String streetName;
    public final int speedLimit;
    public final Street(...){...}
}

public class RoadNetwork{
    public final Graph<Intersection, Street> network=new DefaultDirectedGraph<>(Street.class);
    Intersection i1=new Intersection(..);
    Intersection i2=new Intersection(..);
    Street s=new Street(..);

    //Network with 1 street
    network.addVertex(i1);
    network.addVertex(i2);
    network.addEdge(i1,i2,s);
}

Примечания:

  1. Street расширяет DefaultWeightedEdge: больше нет необходимости расширять DefaultEdge или DefaultWeightedEdge в последних версиях jgrapht.
  2. В jgrapht все ребра являются объектами. Когда вы используете настраиваемые объекты (такие как Street) в приведенном выше примере, вы можете использовать только метод addEdge(vertex1, vertex2, edgeObject). Вы не можете использовать метод addEdge(vertex1,vertex2), если не предоставите EdgeFactory конструктору графа.
  3. Распространенной ошибкой является хранение информации о графе на ребрах. Например. Было бы неправильно хранить исходное и целевое пересечение (две конечные точки улицы) в самом объекте улицы. Эта информация хранится в графе.
  4. При реализации собственных классов вершин или ребер вы должны реализовать методы equals и hashCode. См. https://github.com/jgrapht/jgrapht/wiki/Users:-EqualsAndHashCode для получения подробной информации.
person Joris Kinable    schedule 19.03.2018
comment
Большое спасибо, это было действительно полезно. - person Mina Nabi; 20.03.2018