Java:加权有向图,其中顶点是OBJECTS

时间:2016-03-19 14:29:12

标签: java data-structures graph

我需要创建一个加权有向图。我已经看到的实现将顶点表示为简单整数,并且边缘用邻接列表表示。但是我需要由自定义类的对象表示的顶点。有了这个图,我需要执行典型的操作(特别是Dijkstra)。

我的想法是以某种方式将对象表示为整数,但我不知道如何提出可以双向转换的散列函数(即顶点到int和int到顶点)。

1 个答案:

答案 0 :(得分:0)

如果您真的想在图表中将顶点表示为(唯一)整数,可以使用ArrayList从顶点映射到对象,并使用HashMap<MyObject, Integer>进行映射。您可以将此对包装在您自己的类中,提供getIndex()getElement()(如下面所示),这可能会提高可读性。

那就是说,为什么不使用http://jgrapht.org或类似的库?

public class IndexMap<T> {
  private List<T> elements = new ArrayList<>();
  private Map<T, Integer> indices = new HashMap<>();

  public int add(T element) {
    int index = elements.size();
    elements.add(element);
    indices.put(element, index);
    return index;
  }

  public int getIndex(T element) {
    Integer index = indices.get(element);
    return index == null ? -1 : index;
  }

  public T getElement(int index) {
    return elements.get(index);
  }

如果您不需要(重新)使用预先存在的基于整数的图并且不能使用库,您可以选择实现自己的Vertex类而不是存储对象:

 class Vertex<T> {
   T element;
   List<Vertex<T>> edges = new ArrayList<>();

   Vertex(T element) {
     this.element = element;
   }

   void addEdge(Vertex<t> to) {
     edges.add(to);
   }

   ...
 }