Java中填充ArrayList数字间隙的fillList方法实现疑问
问题分析与解决方案
首先你当前的代码存在几个核心问题:
- 循环条件
i < List.size()会因为持续添加元素导致无限循环,且当i走到原列表最后一个元素时,List.get(i+1)会直接抛出索引越界异常 List.add()默认是把元素追加到列表末尾,而你需要在相邻两个元素之间插入中间值,位置完全错误else if分支里用List.get(i-1),当i=0时会触发索引越界,逻辑也完全不符合“从当前值递减到下一个值的前一个数”的需求
正确实现思路
下面提供两种清晰的实现方式,都能满足你的需求:
方式1:基于原列表直接插入
核心逻辑是先记录原列表的长度,避免插入元素后遍历范围混乱,然后在每对相邻元素之间插入缺失的中间值:
import java.util.ArrayList; public class ListFiller { public static void fillList(ArrayList<Integer> list) { // 记录原列表元素个数,防止插入元素后遍历逻辑混乱 int originalSize = list.size(); int i = 0; // 遍历原列表的相邻元素对,只到倒数第二个元素 while (i < originalSize - 1) { int current = list.get(i); int next = list.get(i + 1); if (current < next) { // 从current+1开始,插入到i+1位置,直到等于next-1 for (int num = current + 1; num < next; num++) { list.add(i + 1, num); i++; // 插入后,下一个元素的位置后移一位 } } else if (current > next) { // 从current-1开始,插入到i+1位置,直到等于next+1 for (int num = current - 1; num > next; num--) { list.add(i + 1, num); i++; // 插入后,下一个元素的位置后移一位 } } // 处理完当前对,移动到下一对原元素 i++; } } public static void main(String[] args) { ArrayList<Integer> testList = new ArrayList<>(); testList.add(4); testList.add(8); testList.add(5); testList.add(9); fillList(testList); System.out.println(testList); // 输出 [4, 5, 6, 7, 8, 7, 6, 5, 6, 7, 8, 9] } }
方式2:构建新列表后替换原列表内容
这种方式逻辑更直观,避免了原列表插入时的索引调整,可读性更高:
import java.util.ArrayList; public class ListFiller { public static void fillList(ArrayList<Integer> list) { if (list.size() <= 1) { return; // 没有相邻元素,无需处理 } ArrayList<Integer> newList = new ArrayList<>(); newList.add(list.get(0)); for (int i = 0; i < list.size() - 1; i++) { int current = list.get(i); int next = list.get(i + 1); if (current < next) { for (int num = current + 1; num <= next; num++) { newList.add(num); } } else if (current > next) { for (int num = current - 1; num >= next; num--) { newList.add(num); } } else { // 处理两个元素相等的边界场景 newList.add(next); } } // 清空原列表并替换为新列表内容 list.clear(); list.addAll(newList); } public static void main(String[] args) { ArrayList<Integer> testList = new ArrayList<>(); testList.add(4); testList.add(8); testList.add(5); testList.add(9); fillList(testList); System.out.println(testList); // 输出 [4, 5, 6, 7, 8, 7, 6, 5, 6, 7, 8, 9] } }
关键说明
- 两种方式都能实现需求,方式2代码更简洁易懂,不容易出错;方式1不需要额外的列表空间,适合处理大型列表
- 代码中覆盖了元素相等的边界场景,避免出现遗漏情况
内容的提问来源于stack exchange,提问作者MazaPan616
相关产品推荐
相关产品推荐

