Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现适当邻接列表以表示图形的最佳实践_Java_Graph - Fatal编程技术网

Java 实现适当邻接列表以表示图形的最佳实践

Java 实现适当邻接列表以表示图形的最佳实践,java,graph,Java,Graph,我想实现一个graph类。我决定使用邻接图来表示图形,如下所示: // Option 1: HashMap<Node<T>, List<Edge<T>>> adjacencyMap; // not so good. //选项1: HashMap邻接映射;//不太好。 现在我的问题是关于这种结构的最佳实践。在这个映射中使用节点类作为键不是一个坏主意吗?我甚至不能处理邻接映射,因为识别值是顶点,节点类的一个字段 public class N

我想实现一个graph类。我决定使用邻接图来表示图形,如下所示:

// Option 1:

HashMap<Node<T>, List<Edge<T>>> adjacencyMap;    // not so good.
//选项1:
HashMap邻接映射;//不太好。
现在我的问题是关于这种结构的最佳实践。在这个映射中使用节点类作为键不是一个坏主意吗?我甚至不能处理邻接映射,因为识别值是顶点,节点类的一个字段

public class Node<T> {

    private T vertex;
}
公共类节点{
私有T顶点;
}
否则,如果映射节点的显式顶点(特定值),则将顶点(值)连接到节点列表(包含该顶点的类)。这是个好主意还是我遇到了问题

// Option 2:

HashMap<<T>, List<Edge<T>>> adjacencyMap;    // better 
//选项2:
HashMap邻接映射;//更好
为完整起见,以下是其他类别:

public class Graph<T> {

    private HashMap<Node<T>, List<Edge<T>>> adjacencyMap;
}

public class Edge<T> {

    private Node<T> nodeX;
    private Node<T> nodeY;
    private double weight;
}
公共类图{
私有HashMap邻接映射;
}
公共阶级边缘{
专用节点nodeX;
私有节点nodeY;
私人双倍重量;
}
一个明显的设计选择是将边列表放入节点类中,然后将顶点映射到节点类,但我发现在节点中维护边是一种奇怪的结构


有人能提供关于这个问题的最佳实践吗?

Scott Mitchell早在2005年就写了一篇关于这个过程的深入文章,但他是用C#完成的。如果您不熟悉C#,我想您会发现它在语法上与Java非常相似。他提出了两个类来创建Graph类和GraphNode类。对于您的项目来说,这可能值得一看——请参阅Thank,基本上他还在node类中实现边列表。也许这是最好的解决方案,它让我很烦,因为它是一种非常反直觉的方法来封装节点中的边。我认为当你开始实现遍历算法,如最小生成树和Dijkstra的最短路径时,它会变得更直观。如果要向边添加特性,可以使用对象,而不是Scott使用的基元int cost。