You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:30:50