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

Java ArrayList字母排序方法报错求助:索引越界与内存溢出

问题分析

  1. 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作为插入索引,逻辑根本不成立。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:05:22