如何实现 Java 图形数据结构和 class 可见性受限?

How to implement Java graph data-structure and class with restricted visibility?

我目前正在学习数据结构(例如 LinkedList、DoublyLinkedList、ArrayList 等),我想知道如何在 Java.

中实现(非定向)图

我在考虑两个 classes:GraphNode<T>
每个节点都应该知道它连接到哪些其他节点(List<Node<T>> 合适吗?什么样的列表最好?) Graph class 可以提供像 boolean contains(T element)

这样的方法

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

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

您可以像这样使节点成为私有内部 class:

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

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

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

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

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

A graph is an ordered pair G = (V, E) comprising a set V of vertices or nodes or points together with a set E of edges or arcs or lines, which are 2-element subsets

以下定义应该可以让您清楚地组织图表。它由 Set<Node>Set<Edge> 组成(实现肯定是 HashSet)。 Edge 是一对 fromto NodeEdge 可以有一个属性 cost 用于加权图。如果您需要无向图,您可以存储两个有向 Edge 表示一个无向边或将 属性 undirected 添加到 Edge class.

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;
    }
}