Java列表遍历问题:removeShorterStringsList方法奇数长度列表索引越界排查
问题分析与修复
核心问题
你的代码出现索引越界的原因有三个:
- 循环条件依赖初始长度,未动态更新:你一开始就把列表长度存在
size变量里,但循环中修改了列表内容,size却始终是初始值。比如处理长度为3的列表时,初始size=3,循环条件i < size-1即i<2。当处理完i=0后,列表长度已缩短为2,但循环仍会执行i=1的情况,此时i+1=2超出了当前列表的最大索引1,直接触发越界异常。 - 奇数长度时的
i++逻辑错误:你试图通过手动递增i来跳过元素,但这个操作和动态变化的列表长度不匹配,反而加速了i达到越界值的过程。 - 对象移除存在风险:
a.remove(two)或a.remove(one)会移除列表中第一个匹配的元素,如果列表存在重复字符串,可能误删非目标位置的元素,逻辑不安全。
修复后的代码
public static void removeShorterStringsList(List<String> a) { int i = 0; // 动态判断当前列表长度,只要还有至少两个元素就处理 while (i < a.size() - 1) { String one = a.get(i); String two = a.get(i + 1); if (one.isEmpty() || two.isEmpty()) { throw new IllegalArgumentException("String is empty"); } if (one.length() >= two.length()) { // 通过索引移除第二个元素,避免重复元素误删 a.remove(i + 1); } else { // 通过索引移除第一个元素 a.remove(i); } // 处理完一对后,索引递增1,继续处理下一组连续元素 i++; } }
修复逻辑说明
- 改用
while循环,基于当前列表的实时长度判断循环条件,避免初始长度导致的越界。 - 使用索引移除元素(
remove(i)或remove(i+1)),确保只删除当前处理的目标元素,避免重复字符串的干扰。 - 移除元素后,索引
i递增1:因为移除一个元素后,原列表中后续的元素会自动前移,此时i指向的位置就是下一组连续元素的起始位置,符合需求中的“每一对连续元素”处理逻辑。
测试验证
- 输入
["four", "score", "and", "seven", "years", "ago"],处理后得到["score", "seven", "years"],符合预期。 - 输入
["hello", "good", "morning"],处理后得到["hello", "morning"],无索引越界异常,符合预期。
内容的提问来源于stack exchange,提问作者andrewrios
相关产品推荐
相关产品推荐

