繁体   English   中英

Java:顶点为对象的加权有向图

[英]Java: Weighted Directed Graph where the vertices are OBJECTS

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

我的想法是以某种方式哈希表示对象为整数,但我不知道如何提出可以同时转换的哈希函数(即,将顶点转换为int并将int转换为int)。

如果您确实想将顶点表示为图形中的(唯一)整数,则可以使用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);
   }

   ...
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM