为何嵌套循环仅迭代14次?Java字节数组遍历问题
嵌套while循环遍历字节数组提前终止的问题解决
问题原因
你的代码只输出14条结果,核心问题是内层循环变量递增到上限后没有重置:
- 当最内层的
moveSet[3]递增到14时,退出该循环,此时moveSet[3]的值保持为14 - 接着
moveSet[2]递增,但你没有把moveSet[3]重置为0,下一次进入moveSet[2]的循环时,moveSet[3] < 14的条件不成立,直接跳过内层循环 - 以此类推,
moveSet[2]递增到14后,moveSet[1]递增,但moveSet[2]和moveSet[3]都停留在14,后续所有内层循环都无法执行 - 最终只有最内层的14种组合被输出,外层循环完全没有发挥作用
修正方案
方案一:补全while循环的变量重置逻辑
在每次外层循环启动时,把内层的数组元素重置为0,确保每次进入内层循环时变量都是从0开始:
import java.util.Arrays; public class MoveIterator { public static void iterateThroughMoves() { byte[] moveSet = {0, 0, 0, 0}; while(moveSet[0] < 14) { moveSet[1] = 0; // 重置第二个元素 while(moveSet[1] < 14) { moveSet[2] = 0; // 重置第三个元素 while(moveSet[2] < 14) { moveSet[3] = 0; // 重置第四个元素 while(moveSet[3] < 14) { System.out.println(Arrays.toString(moveSet)); moveSet[3]++; } moveSet[2]++; } moveSet[1]++; } moveSet[0]++; } } public static void main(String[] args) { iterateThroughMoves(); } }
方案二:改用for循环(更推荐)
for循环的语法天然包含初始化、条件判断、递增三个步骤,能从根源上避免忘记重置变量的问题,代码逻辑更清晰:
import java.util.Arrays; public class MoveIterator { public static void iterateThroughMoves() { byte[] moveSet = new byte[4]; for (moveSet[0] = 0; moveSet[0] < 14; moveSet[0]++) { for (moveSet[1] = 0; moveSet[1] < 14; moveSet[1]++) { for (moveSet[2] = 0; moveSet[2] < 14; moveSet[2]++) { for (moveSet[3] = 0; moveSet[3] < 14; moveSet[3]++) { System.out.println(Arrays.toString(moveSet)); } } } } } public static void main(String[] args) { iterateThroughMoves(); } }
补充说明
两种方案都能输出所有14^4=38416种组合,其中for循环的写法更符合Java遍历多维度组合的常规习惯,后续维护或扩展(比如增加数组长度)时更不容易出错。
内容的提问来源于stack exchange,提问作者PoultryPants
相关产品推荐
相关产品推荐

