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

Java实现插入排序时向ArrayList添加元素程序执行不停止问题

问题产生原因
  1. 死循环的直接诱因:内层for循环的终止条件为j < list2.size(),你在循环体内调用list2.add()方法时,list2的长度会实时增加,j的增长速度永远追不上list2长度的增长速度,导致循环永远无法终止。
  2. 底层逻辑错误:插入逻辑不需要在遍历每一个list2元素时都执行,你当前的写法会导致同一个待插入元素被重复添加多次,就算解决了死循环问题也会得到错误的排序结果。你只需要找到第一个比待插入元素大的位置,插入一次即可,比所有元素都大的话直接插到列表末尾。
修复方案

调整逻辑:先遍历list2找到正确的插入位置,统一执行一次插入操作,不要在遍历过程中修改list2的长度。
修复后的完整代码如下:

import java.util.*;
import java.util.ArrayList;
  
public class SortLists {
    
    public static void main(String args[])
    {
        // 待排序列表 [5,1,4,2,8]
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(1);
        list.add(4);
        list.add(2);
        list.add(8);

        System.out.println("原列表 : " + list);
        
        // 存储排序结果的新列表
        List<Integer> sortedList = new ArrayList<Integer>();
        
        // 遍历待排序的整数列表
        for (int i = 0; i < list.size(); i++){
            Integer current = list.get(i);
            // 第一个元素直接存入新列表
            if (i == 0){
                sortedList.add(current);
                continue;
            }
            // 默认插入位置为列表末尾(当前元素比所有已存元素都大的情况)
            int insertIndex = sortedList.size();
            // 遍历已排序的新列表,找第一个比当前元素大的位置
            for (int j = 0; j < sortedList.size(); j++){
                if (current < sortedList.get(j)) {
                    insertIndex = j;
                    // 找到位置就直接退出循环,不需要继续遍历
                    break;
                }
            }
            // 统一执行一次插入操作
            sortedList.add(insertIndex, current);
        }
        System.out.println("排序后列表 : " + sortedList);
    }
}

运行后输出结果为:

原列表 : [5, 1, 4, 2, 8]
排序后列表 : [1, 2, 4, 5, 8]

内容的提问来源于stack exchange,提问作者Jorge Mendes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:54:05