【问题标题】:Java: Weighted Directed Graph where the vertices are OBJECTSJava:顶点为对象的加权有向图
【发布时间】:2016-03-19 14:29:11
【问题描述】:

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

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

【问题讨论】:

    标签: java data-structures graph


    【解决方案1】:

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

    【讨论】:

    • 这是一个学校作业,不确定我是否可以使用那个图书馆。我的问题是想出一个函数来将我的对象(两个字符串)映射到一个唯一的 int,但也可以反转一个。
    • 啊,IndexMap 非常合理。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多