Java自定义SortedIntList类add方法for循环逻辑缺陷:未输出最大整数200
问题根因定位
你当前的add方法存在多处逻辑缺陷,直接导致最大值200丢失、最终仅输出9个元素,核心问题如下:
- 循环边界固定导致元素丢失:for循环的终止条件
i < numElements是进入循环时计算的固定值,不会随循环过程中numElements的动态变化更新。当你对插入位置后的元素做移位操作时,循环最多只能遍历到初始numElements-1的索引位置,最后一个被挪动出位置的元素(也就是插入25时被挤出来的200)根本没有被写入数组,直接丢失。 - 元素计数逻辑混乱:代码在移位分支、尾部插入分支中零散重复执行numElements++操作,既会出现重复累加计数的问题,也会在数组即将存满(numElements=9)时,因为判断条件
numElements +1 != list.length不成立,漏更新计数,导致即使元素写入了数组,也不会被toString方法遍历到。 - 错误的硬编码中断逻辑:移位分支中写的
if (temp == 0) break完全不符合整数列表的业务逻辑,SortedIntList本身就允许存储0值,当移位碰到数组初始的零值时就提前中断,会导致移位流程不完整,后续元素无法正确归位。 - 数组越界风险:移位分支中判断
if (i == list.length -1)时,直接写入list[i+1] = temp,但list的最大索引是list.length-1,这个写入操作会触发数组越界。
修复方案
有序列表插入的逻辑本就不需要复杂的状态标记和零散的计数更新,按照标准的插入排序思路重构add方法即可彻底解决问题:
- 首先校验数组容量,满了就直接返回不执行后续操作
- 从前到后遍历现有元素,找到第一个比待插入值大的位置作为插入点;如果所有现有元素都比待插入值小,就把插入点设为当前元素总数的位置(也就是追加到尾部)
- 从插入点开始,把后面的所有元素从后往前依次向后挪一位,给待插入值腾出空间
- 把待插入值写入插入点
- 统一把元素总数numElements加1
修复后的add方法代码:
public void add(int value) { // 容量校验 if (numElements == list.length) { System.out.println("Can't add, list is full"); return; } // 定位插入位置 int insertIndex = numElements; // 默认追加到尾部(处理最大值场景) for (int i = 0; i < numElements; i++) { if (value < list[i]) { insertIndex = i; break; } } // 从后往前移位腾空间 for (int i = numElements; i > insertIndex; i--) { list[i] = list[i - 1]; } // 写入值、更新计数 list[insertIndex] = value; numElements++; }
按照这个逻辑修改后,不管是插入最小值、中间值还是最大值,都可以正确存入并排序,不会出现元素丢失、计数漏更的问题,最终可以完整输出全部10个元素。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

