Java实现插入排序时向ArrayList添加元素程序执行不停止问题
问题产生原因
- 死循环的直接诱因:内层
for循环的终止条件为j < list2.size(),你在循环体内调用list2.add()方法时,list2的长度会实时增加,j的增长速度永远追不上list2长度的增长速度,导致循环永远无法终止。 - 底层逻辑错误:插入逻辑不需要在遍历每一个
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
相关产品推荐
相关产品推荐

