讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

AniShort
AniShort

AI短剧协同制作平台

在二维数组中查找指定索引的相邻元素

陌雪吖_9030

陌雪吖_9030

发布时间:2025-11-10 14:09:10

|

896人浏览过

|

来源于php中文网

原创

在二维数组中查找指定索引的相邻元素

本教程详细介绍了如何在二维数组中查找给定索引的直接相邻元素(上、下、左、右)。文章将阐述核心逻辑,强调边界条件的处理以避免运行时错误,并提供一个完整的java代码示例,演示如何高效且安全地实现这一功能,同时探讨相关的注意事项和最佳实践。

在处理网格状数据或进行图遍历时,经常需要在二维数组中查找某个元素的相邻元素。这看似简单,但需要仔细考虑边界条件,以确保程序的健壮性。本文将深入探讨如何在Java中实现这一功能。

理解二维数组及其索引

二维数组可以被视为一个由行和列组成的网格。在Java中,一个二维数组 int[][] array 可以通过 array[row][col] 的形式访问其元素,其中 row 代表行索引,col 代表列索引。行索引从 0 到 array.length - 1,列索引从 0 到 array[row].length - 1。

确定相邻元素的坐标

对于二维数组中位于 (r, c) 索引的元素,其直接相邻元素(上、下、左、右)的坐标可以通过简单的偏移量计算得出:

  • 上方邻居: (r - 1, c)
  • 下方邻居: (r + 1, c)
  • 左侧邻居: (r, c - 1)
  • 右侧邻居: (r, c + 1)

为了更通用和简洁地处理这些方向,我们可以使用两个数组来存储行和列的偏移量:

  • dr = {-1, 1, 0, 0} (行偏移量:上、下、无、无)
  • dc = {0, 0, -1, 1} (列偏移量:无、无、左、右)

通过遍历这两个数组,我们可以计算出所有四个潜在邻居的坐标 (r + dr[i], c + dc[i])。

处理边界条件

在计算出潜在邻居的坐标后,最关键的一步是验证这些坐标是否在二维数组的有效范围内。如果尝试访问数组边界之外的索引,Java 将抛出 ArrayIndexOutOfBoundsException 运行时错误。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载

一个坐标 (newR, newC) 是有效的,当且仅当它满足以下所有条件:

  1. newR >= 0 (行索引不能小于0)
  2. newR
  3. newC >= 0 (列索引不能小于0)
  4. newC

Java 实现示例

以下是一个完整的Java代码示例,演示如何查找给定索引的直接相邻元素,并妥善处理边界条件:

import java.util.ArrayList;
import java.util.List;

public class TwoDArrayNeighbors {

    /**
     * 创建一个示例二维数组。
     *
     * @return 初始化的二维数组
     */
    public static int[][] createGraph() {
        return new int[][]{
                {1, 2, 3, 4, 5},
                {6, 7, 8, 9, 10},
                {11, 12, 13, 14, 15},
                {16, 17, 18, 19, 20}
        };
    }

    /**
     * 查找二维数组中指定索引的直接相邻元素(上、下、左、右)。
     *
     * @param graph 二维数组
     * @param r     目标元素的行索引
     * @param c     目标元素的列索引
     * @return 包含所有有效相邻元素值的列表
     */
    public static List<Integer> findNeighbors(int[][] graph, int r, int c) {
        List<Integer> neighbors = new ArrayList<>();

        // 处理空数组或不规则数组的边界情况
        if (graph == null || graph.length == 0 || graph[0].length == 0) {
            return neighbors;
        }

        int numRows = graph.length;       // 数组的总行数
        int numCols = graph[0].length;    // 数组的总列数(假定为矩形数组)

        // 定义四个方向的偏移量:上、下、左、右
        int[] dr = {-1, 1, 0, 0}; // 行偏移量
        int[] dc = {0, 0, -1, 1}; // 列偏移量

        // 遍历四个方向
        for (int i = 0; i < 4; i++) {
            int newR = r + dr[i]; // 计算新行索引
            int newC = c + dc[i]; // 计算新列索引

            // 检查新坐标是否在数组边界内
            if (newR >= 0 && newR < numRows && newC >= 0 && newC < numCols) {
                neighbors.add(graph[newR][newC]); // 如果有效,则添加到邻居列表
            }
        }
        return neighbors;
    }

    public static void main(String[] args) {
        int[][] myGraph = createGraph();
        int targetRow = 2;
        int targetCol = 2; // 对应值 13

        System.out.println("原始二维数组:");
        for (int[] row : myGraph) {
            for (int val : row) {
                System.out.printf("%3d", val); // 格式化输出,使对齐
            }
            System.out.println();
        }

        System.out.println("\n查找索引 (" + targetRow + ", " + targetCol + ") 处元素 " + myGraph[targetRow][targetCol] + " 的邻居:");

        List<Integer> neighbors = findNeighbors(myGraph, targetRow, targetCol);
        System.out.println("邻居元素值: " + neighbors); // 预期输出 [8, 18, 12, 14] (顺序可能因dr/dc定义而异)

        // 测试边界情况:左上角元素
        System.out.println("\n查找索引 (0, 0) 处元素 " + myGraph[0][0] + " 的邻居:");
        System.out.println("邻居元素值: " + findNeighbors(myGraph, 0, 0)); // 预期输出 [6, 2]

        // 测试边界情况:右下角元素
        System.out.println("\n查找索引 (3, 4) 处元素 " + myGraph[3][4] + " 的邻居:");
        System.out.println("邻居元素值: " + findNeighbors(myGraph, 3, 4)); // 预期输出 [19, 15]
    }
}

代码解析:

  1. createGraph() 方法用于初始化一个示例的二维数组。
  2. findNeighbors(int[][] graph, int r, int c) 方法是核心逻辑实现。
  3. 首先,它处理了 graph 为 null 或空数组的特殊情况,直接返回空列表。
  4. numRows 和 numCols 获取数组的维度。这里假设是一个矩形数组,即所有行的长度相同。
  5. dr 和 dc 数组定义了上下左右四个方向的行和列偏移量。
  6. 循环遍历这四个方向,计算出每个潜在邻居的 newR 和 newC 坐标。
  7. if (newR >= 0 && newR = 0 && newC
  8. main 方法演示了如何使用 findNeighbors 方法,并包含了对中心元素和角点元素的测试,以验证边界处理的正确性。

注意事项与扩展

  1. 邻居定义的多样性: 上述示例仅查找了上下左右四个方向的直接邻居。如果需要包含对角线邻居(共8个方向),可以扩展 dr 和 dc 数组:

    // 8个方向:上、下、左、右、左上、右上、左下、右下
    int[] dr = {-1, 1, 0, 0, -1, -1, 1, 1};
    int[] dc = {0, 0, -1, 1, -1, 1, -1, 1};

    同时,循环次数也需要从 4 变为 8。

  2. 返回类型选择: 根据具体需求,findNeighbors 方法可以返回不同类型的结果:

    • List:如示例所示,返回邻居的元素值。
    • List:返回邻居的坐标 (newR, newC),每个 int[] 包含两个元素。
    • 自定义对象:如果邻居需要携带更多信息(例如距离、属性等),可以定义一个自定义类来表示邻居。
  3. 不规则二维数组: Java 中的二维数组实际上是“数组的数组”,这意味着每行的长度可以不同(即不是严格的矩形)。上述代码的 numCols = graph[0].length 假定所有行的长度相同。对于不规则数组,在检查列边界时,需要使用 graph[newR].length 而不是 graph[0].length:

    // ... 在循环内部
    if (newR >= 0 && newR < numRows) { // 先检查行边界
        // 确保新行存在且不为空,再检查列边界
        if (graph[newR] != null && newC >= 0 && newC < graph[newR].length) {
            neighbors.add(graph[newR][newC]);
        }
    }

    这增加了额外的复杂性,但在处理非矩形网格时是必要的。

  4. 性能考量: 对于查找单个元素的邻居,上述方法的时间复杂度是常数 O(1)(因为只检查固定数量的邻居),效率非常高。即使对于非常大的二维数组,其性能也表现良好。

总结

在二维数组中查找指定索引的相邻元素是一个常见的操作。其核心在于通过坐标偏移量确定潜在邻居,并严格检查这些潜在坐标是否位于数组的有效边界内,以避免 ArrayIndexOutOfBoundsException。通过使用方向偏移量数组,代码可以变得更加简洁和易于扩展,以适应不同类型的邻居定义。理解并正确处理边界条件是编写健壮、可靠代码的关键。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

569

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

string转int
string转int

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

7539

2023.08.02

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

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

3565

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4708

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

3145

2025.08.29

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

2007

2023.09.19

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

40

2026.11.12

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn