如何更优雅地引用二维数组中的非对角相邻元素?
优化思路与方案
针对提取二维数组中(x,y)上下左右四个非对角相邻元素的需求,这里提供几种更简洁优雅的实现方式:
1. 枚举方向偏移数组(可读性&可维护性最佳)
这种方式完全规避了冗余循环和条件判断,把四个方向的偏移量明确列出来,逻辑一目了然,后续调整方向也只需修改数组:
int[][] dirs = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; for (int[] dir : dirs) { n.add(arr[x + dir[0]][y + dir[1]]); }
优点:仅4次迭代,性能最优;如果后续需要增减方向(比如加对角线),直接修改dirs数组即可,不用动循环逻辑。
2. 简化嵌套循环的条件判断
你当前的if(Math.abs(i) == Math.abs(j)) continue;已经很简洁,但可以用异或逻辑换一种写法,直接判断有效方向:
for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { // 异或:i和j恰好有一个不为0,即水平/垂直方向 if ((i != 0) ^ (j != 0)) { n.add(arr[x + i][y + j]); } } }
不过这种写法需要读者理解异或运算的含义,可读性因人而异,不如偏移数组直观。
3. 单循环拆分偏移量
如果不想用嵌套循环,也可以把x、y方向的偏移拆成两个一维数组,用单循环遍历:
int[] dx = {0, 0, -1, 1}; int[] dy = {-1, 1, 0, 0}; for (int k = 0; k < 4; k++) { n.add(arr[x + dx[k]][y + dy[k]]); }
效果和偏移数组一致,只是存储形式不同,同样简洁高效。
总结
从日常开发的实用性来看,首推方向偏移数组的实现——它兼顾了简洁性、可读性和可维护性,没有多余的逻辑;如果要基于你现有的嵌套循环优化,异或判断的写法可以替代原有条件,但需要团队成员能快速理解;而最初的硬编码写法虽然直接,但后续修改方向时要改动多行代码,灵活性不足。
内容的提问来源于stack exchange,提问作者Kentalian
相关产品推荐
相关产品推荐

