如何按首尾交替方式遍历数组?解决ArrayIndexOutOfBoundsException报错
嗨,我来帮你搞定这个数组遍历的问题~
首先,你的代码抛出ArrayIndexOutOfBoundsException的原因很明确:循环条件用了start != end,导致当start超过end之后,循环还会继续执行。比如你示例里的数组长度是6,当第三次循环结束后,start变成3,end变成2,这时候start != end依然成立,循环会继续打印arr[3]和arr[2],然后start变成4,end变成1……直到start超过数组的最大索引(5),或者end变成负数,这时候访问数组元素自然就越界了。
那怎么修正呢?我们需要把循环条件改成start < end,这样当start和end交叉(偶数长度)或者相遇(奇数长度)时,循环就会停止。另外,还要处理数组长度为奇数的情况——这时候循环结束后start和end会指向同一个中间元素,需要单独打印它。
给你修正后的代码:
char[] arr = {'a', 'b', 'c', 'd', 'e', 'f'}; int start = 0; int end = arr.length - 1; while (start < end) { System.out.print(arr[start] + " " + arr[end] + " "); start++; end--; } // 处理奇数长度的数组,打印中间剩下的元素 if (start == end) { System.out.print(arr[start]); }
我们来测试不同场景:
- 对于你的示例数组
[a,b,c,d,e,f](长度6,偶数):循环执行3次,依次打印a f、b e、c d,循环结束后start=3,end=2,不满足start==end,最终输出a f b e c d,完全符合需求。 - 如果是奇数长度的数组,比如
[a,b,c,d,e]:循环执行2次,打印a e、b d,循环结束后start=2,end=2,会打印中间的c,最终输出a e b d c,也符合首尾交替的逻辑。 - 空数组或者长度为1的数组也不会报错:空数组的话
end=-1,start < end不成立,循环不执行;长度为1的数组start==end,直接打印唯一的元素。
这样修改后,就能完美避免越界问题,同时覆盖所有场景的首尾交替遍历需求啦~
内容的提问来源于stack exchange,提问作者Linda Weston
相关产品推荐
相关产品推荐

