如何实现具有受限可见性的Java图形数据结构和类?

时间:2017-04-28 13:42:58

标签: java data-structures graph visibility class-visibility

我目前正在学习数据结构(例如LinkedList,DoublyLinkedList,ArrayList,...),我想知道如何在Java中实现(非定向)图形。

我在考虑两个课程:GraphNode<T>
每个节点应该知道它连接的是哪个其他节点(List<Node<T>>是否合适?什么样的List最好?) 然后,Graph类可以提供boolean contains(T element)

等方法

Node类没有其他用途,那么如何限制可见性以便只有Graph才能访问?

编辑:此外,我如何权衡节点之间的连接?我想我需要一个与上面提到的完全不同的实现,因为一个简单的连接节点列表是不够的?

3 个答案:

答案 0 :(得分:1)

您可以将Node设为私有内部类:

public class Graph<T> {
    /* code */

    private class Node<T> {
        /* code */
    }
}

对于链接权重:不是将相邻节点保存为列表,而是将它们保存为HashMap<Node, Double>,将每个节点映射到一定的权重。

注意:此实现实际上是一个有向图。

答案 1 :(得分:1)

  

图是有序对G =(V,E),包括一组顶点   或节点或点与边缘或弧或线的集合E,   这是2元素子集

以下定义应该为您提供一种组织图表的明确方法。它由Set<Node>Set<Edge>组成(实现肯定是HashSet)。 Edge是一对fromto NodeEdge可以为加权图提供属性cost。如果您需要无向图,则可以存储指示一个无向边的两个有向Edge或向undirected类添加属性Edge

public class Graph<T> {

    private Set<Node<T>> nodes;
    private Set<Edge<T>> edges;

    private class Node<T> {
        private T value;
    }

    private class Edge<T> {
        private Node<T> to;
        private Node<T> from;
        private Number cost;
    }
}

答案 2 :(得分:0)

我建议您应该学习一个名为JGraphT的第三方包,并研究它如何构建具有不同属性的图。