手机拨号盘数字关联映射代码嵌套循环无法进入问题求助
问题根源分析与修复方案
嘿,我一眼就揪出你这个循环不执行的问题啦!核心问题出在循环的终止条件写错了,咱们一步步拆解清楚:
1. 循环条件的致命错误
你写的循环代码是:
for(int currentRowIndex=rowFrom; currentRowIndex==rowTo; currentRowIndex++)
这个循环的逻辑是:只有当currentRowIndex严格等于rowTo时,才会执行循环体。但结合你的需求(遍历相邻行来生成数字关联),这个条件完全不符合预期:
- 如果
rowFrom和rowTo不相等,第一次判断就不满足条件,直接跳过整个循环,自然看不到LOG输出; - 就算
rowFrom等于rowTo,也只会执行一次,根本无法覆盖相邻行的范围。
你真正需要的是范围遍历,把循环条件改成如下形式(假设rowFrom <= rowTo,比如当前行是0,要遍历-1、0、1这三个行范围):
for(int currentRowIndex=rowFrom; currentRowIndex <= rowTo; currentRowIndex++)
2. 额外的边界处理建议
因为拨号盘的行范围是0到3(共4行),遍历的时候还要避免数组越界,同时要跳过null的无效位置,给你补全完整的逻辑示例:
// 假设你已经拿到目标数字的位置targetRow、targetCol int rowFrom = targetRow - 1; int rowTo = targetRow + 1; int colFrom = targetCol - 1; int colTo = targetCol + 1; for(int currentRowIndex=rowFrom; currentRowIndex <= rowTo; currentRowIndex++) { // 跳过超出拨号盘范围的行 if(currentRowIndex < 0 || currentRowIndex >= dialpad.length) { continue; } for(int currentColIndex=colFrom; currentColIndex <= colTo; currentColIndex++) { // 跳过超出当前行列范围的列 if(currentColIndex < 0 || currentColIndex >= dialpad[currentRowIndex].length) { continue; } Integer num = dialpad[currentRowIndex][currentColIndex]; // 跳过null值,以及数字自身 if(num == null || (currentRowIndex == targetRow && currentColIndex == targetCol)) { continue; } // 这里添加关联逻辑,比如把num加入当前数字的关联列表 LOG.info("关联数字:{}", num); } }
3. 实际例子验证
比如数字1在拨号盘的(0,0)位置,按上述逻辑:
- 行范围是
-1到1,列范围是-1到1; - 跳过无效的行
-1和列-1,跳过数字自身(0,0); - 最终会关联到
(0,1)的2、(1,0)的4、(1,1)的5,完全符合你定义的规则。
内容的提问来源于stack exchange,提问作者VictorGram
相关产品推荐
相关产品推荐

