关于Java二维数组子数组判断函数的循环逻辑疑问
核心比对逻辑与迭代流程解析
整体逻辑说明
这段代码是在已找到photo[i][j]与sub[0][0]匹配的前提下,逐个校验sub剩余所有元素是否和photo对应区域的元素完全匹配——全部匹配就直接返回true,只要有一个不匹配就终止当前比对,继续寻找下一个可能的起始位置。
逐行代码逻辑拆解
while (flag) { if (row==sub.length-1&&col==sub[0].length-1) return true; if (sub[row][col]==photo[i+row][j+col]) { if (col==sub[0].length-1) { //last col col =0; row++; } else { col++; } } else flag =false; }
1. 循环运行条件
while (flag):flag初始为true,只要当前比对没发现不匹配,就持续循环。
2. 匹配完成的终止判断
if (row==sub.length-1&&col==sub[0].length-1) return true;
- 先判断当前是否已经遍历到
sub的最后一个元素(行索引是最后一行,列索引也是最后一列),如果是,说明所有元素都匹配成功,直接返回true,确认sub是photo的子数组。
3. 元素比对与迭代控制
if (sub[row][col]==photo[i+row][j+col]):
- 比对当前
sub[row][col]和photo对应位置的元素(photo起始位置是(i,j),对应位置为i+row行、j+col列):- 匹配成功时:
- 若
col是sub的最后一列:当前行元素已全部比对完,将列索引重置为0,行索引加1,开始比对下一行的第一个元素。 - 若
col不是最后一列:列索引加1,继续比对当前行的下一个元素。
- 若
- 匹配失败时:
- 将
flag设为false,终止当前while循环,回到外层循环寻找下一个可能的起始位置(i,j)。
- 将
- 匹配成功时:
迭代流程示例(以2行2列的sub为例)
假设sub是2行2列,且已找到photo[i][j] == sub[0][0]:
- 初始
row=0, col=1,进入循环:- 先判断是否是最后一个元素((0,1)不是),比对
sub[0][1]和photo[i][j+1]。 - 若匹配:因为
col是最后一列,所以col=0, row=1。
- 先判断是否是最后一个元素((0,1)不是),比对
- 下一次循环:
- 判断是否是最后一个元素((1,0)不是),比对
sub[1][0]和photo[i+1][j]。 - 若匹配:
col不是最后一列,col=1。
- 判断是否是最后一个元素((1,0)不是),比对
- 下一次循环:
- 判断是否是最后一个元素((1,1)是),直接返回
true。
- 判断是否是最后一个元素((1,1)是),直接返回
如果中间任何一步比对失败,flag设为false,循环终止,回到外层寻找下一个起始点。
内容的提问来源于stack exchange,提问作者Itamar B-E
相关产品推荐
相关产品推荐

