Java ArrayList字母排序方法报错求助:索引越界与内存溢出
问题分析
IndexOutOfBoundsException 原因
你的代码中newList.add(inner, wordList.get(outter))存在致命问题:当newList处于初始空状态时,它的size为0,而inner可能取到大于0的值(比如3),但ArrayList.add(int index, E element)要求index必须满足0 ≤ index ≤ size(),否则就会抛出索引越界异常。你完全没考虑newList的实际大小,直接用inner作为插入索引,逻辑根本不成立。OutOfMemoryError 原因
当你直接操作原wordList时,代码只会执行add操作却从未移除任何元素。双重循环中每次满足compareTo < 0就添加元素,导致列表元素数量指数级增长,最终耗尽堆内存。
解决方案
方案1:使用Java内置排序(推荐,高效简洁)
Java集合框架提供了成熟的排序工具,直接调用Collections.sort()即可实现字符串的自然字母排序,无需自己实现复杂逻辑:
import java.util.Collections; import java.util.ArrayList; public ArrayList<String> sortWords(ArrayList<String> wordList) { // 创建原列表的副本,避免修改原列表(如果需要保留原列表的话) ArrayList<String> sortedList = new ArrayList<>(wordList); Collections.sort(sortedList); return sortedList; }
如果允许直接修改原列表,可简化为:
public void sortWords(ArrayList<String> wordList) { Collections.sort(wordList); }
方案2:手动实现排序算法(适合学习目的)
如果你想自己实现排序逻辑,比如冒泡排序,正确实现如下(以创建新列表为例):
public ArrayList<String> sortWords(ArrayList<String> wordList) { ArrayList<String> sortedList = new ArrayList<>(wordList); int n = sortedList.size(); // 冒泡排序核心:相邻元素比较交换,逐步将最大元素移到末尾 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { // 如果前一个元素比后一个大,交换位置 if (sortedList.get(j).compareTo(sortedList.get(j + 1)) > 0) { String temp = sortedList.get(j); sortedList.set(j, sortedList.get(j + 1)); sortedList.set(j + 1, temp); } } } return sortedList; }
或者插入排序,更贴近你原本想“插入到正确位置”的思路:
public ArrayList<String> sortWords(ArrayList<String> wordList) { ArrayList<String> sortedList = new ArrayList<>(); for (String word : wordList) { // 找到当前单词应该插入的位置 int insertIndex = 0; while (insertIndex < sortedList.size() && sortedList.get(insertIndex).compareTo(word) < 0) { insertIndex++; } sortedList.add(insertIndex, word); } return sortedList; }
原代码核心错误总结
- 排序逻辑完全错误:双重循环只是无意义地比较并添加元素,没有实现任何排序算法的核心逻辑(如交换、定位插入位置)。
ArrayList.add(int index, E element)使用错误:未考虑目标列表的当前大小,直接用循环变量作为索引,导致越界。- 操作原列表时未控制元素数量:不断添加元素却不移除,最终导致内存溢出。
内容的提问来源于stack exchange,提问作者N3wb1e
相关产品推荐
相关产品推荐

