Java 图结构实现指南:使用邻接矩阵存储节点与边关系

风芳君_1400

风芳君_1400

2026-02-02

908人浏览

原创

Java 图结构实现指南:使用邻接矩阵存储节点与边关系

本文介绍如何在 java 中高效存储图的节点与边关系,重点讲解基于邻接矩阵的实现方式,包括节点索引映射、连通性判断、边添加逻辑,并强调 equals/hashcode 重写与边界防护等关键实践。

在构建图(Graph)数据结构时,核心挑战之一是如何准确、高效地表示节点(Vertex)之间的连接关系(即边,Edge)。虽然 Map>(邻接表)或自定义 Pair 是可行思路,但当节点数量相对固定、且需频繁查询两点是否连通时,邻接矩阵(Adjacency Matrix) 往往更直观、性能更优——尤其适合后续集成图形界面(如 Swing/JavaFX)进行可视化渲染。

✅ 推荐方案:布尔型邻接矩阵 + 节点数组索引

假设图中节点总数在初始化时已知(例如 n = 10),可采用以下结构:

public class Graph {
    private final Node[] nodes;           // 按索引顺序存储所有节点
    private final boolean[][] adjacent;   // adjacent[i][j] 表示 i→j 是否存在有向边

    public Graph(int n) {
        this.nodes = new Node[n];
        this.adjacent = new boolean[n][n]; // 默认全为 false
    }

    // 注册节点(按顺序分配索引)
    public void addNode(int index, Node node) {
        if (index = nodes.length) {
            throw new IllegalArgumentException("Index out of bounds: " + index);
        }
        this.nodes[index] = node;
    }

    // 建立有向边:从节点 a 到节点 b
    public void connect(int from, int to) {
        validateIndex(from, to);
        adjacent[from][to] = true;
    }

    // 查询两点是否连通(有向)
    public boolean areConnected(int from, int to) {
        validateIndex(from, to);
        return adjacent[from][to];
    }

    // 辅助方法:通过节点对象查找其索引(需 Node 正确重写 equals & hashCode!)
    public int indexOf(Node node) {
        if (node == null) return -1;
        for (int i = 0; i = nodes.length) {
                throw new IllegalArgumentException("Invalid node index: " + i);
            }
        }
    }
}

⚠️ 关键注意事项

  • 必须重写 equals() 和 hashCode()
    Node 类若未重写 equals(),默认使用引用比较(==),导致 indexOf() 永远无法匹配语义相同的节点。推荐基于 ID 或 data 字段实现:

    Edge TTS CN
    Edge TTS CN

    使用 node-edge-tts npm 包将文本转换为语音,支持多种声音、多语言、语速调节及音调控制等功能。

    下载
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Node node = (Node) o;
        return ID == node.ID && Objects.equals(data, node.data);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(ID, data);
    }
  • 邻接矩阵的扩展性
    若节点数动态增长,可用 List> 替代二维数组,但需自行维护行列一致性;若需存储权重(如距离、成本),可将 boolean[][] 升级为 int[][]、double[][] 或自定义对象数组。

  • 有向 vs 无向图
    上述实现默认为有向图。若需无向图,connect(a, b) 应同时设置 adjacent[a][b] = adjacent[b][a] = true。

  • 图形界面衔接提示
    在 GUI 层(如 JavaFX),可将 nodes[] 绑定到 Circle 或 Label 列表,adjacent[][] 驱动 Line 的显示/隐藏,实现节点拖拽、连线高亮等交互效果。

综上,邻接矩阵以空间换时间,逻辑清晰、查询 O(1)、适合中小规模图及可视化场景。配合严谨的索引管理与对象语义比较,即可稳健支撑你的图编辑器开发目标。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java node edge

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.21

3062

5

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.05

2874

4

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

2025.04.24

3232

6

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2023.11.13

2150

6

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.30

163

8

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2023.11.13

2150

6

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.30

163

8

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6939

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3325

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习