Java ArrayList报索引越界错误,按指定规则生成新数组问题求解
问题原因分析
- 索引越界直接原因:
ArrayList.set()方法使用不当newarr初始化后仅添加了2个元素,可用索引只有0和1。循环中i从2开始调用newarr.set(i, ...),目标索引在列表中不存在,直接触发索引越界异常。set方法仅支持修改列表已存在的索引位置,不能用于新增元素。 - 隐藏逻辑错误:直接修改原列表的子视图
List.subList()返回的是原列表的视图,对返回的sub列表排序会直接修改原items列表的元素顺序,违背你「使用原列表原始元素计算中位数」的需求,后续计算的中位数结果都会出错。
修复方案
- 把
newarr.set(i, sub.get(1))替换为newarr.add(sub.get(1)),按顺序追加元素,索引会自动对应 - 截取子列表后复制为新列表再排序,避免修改原列表的元素
修复后完整代码
import java.util.*; public class P2J4 { public static void main (String[]args){ List<Integer> items = Arrays.asList(5,2,9,1,7,4,6,3,8); ArrayList<Integer> newarr = new ArrayList<>(); newarr.add(items.get(0)); newarr.add(items.get(1)); for(int i=2; i<items.size(); i++){ // 截取子列表后复制为新列表,避免修改原列表 List<Integer> sub = new ArrayList<>(items.subList(i-2, i+1)); Collections.sort(sub); // 追加元素代替set操作 newarr.add(sub.get(1)); } // 输出验证结果:[5, 2, 5, 2, 7, 4, 6, 4, 6] System.out.println(newarr); } }
内容的提问来源于stack exchange,提问作者Ranit Bagchi
相关产品推荐
相关产品推荐

