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

实现埃氏筛法时ArrayList触发IndexOutOfBoundsException的问题求助

搞定ArrayList索引越界:埃氏筛场景的坑与解法

老兄,你遇到的IndexOutOfBoundsException: Index: 116, Size: 116问题,本质就是遍历ArrayList时删除元素导致的集合大小变化,和你的循环条件不匹配。

先给你拆解问题:假设你一开始写了类似这样的循环(结合你说的eratosthenes方法逻辑):

public static void eratosthenes(ArrayList<Integer> array) {
    // 错误示范:用初始size作为循环上限
    int total = array.size();
    for (int i = 0; i < total; i++) {
        int current = array.get(i);
        if (isPrime(current)) { // 假设这是你判断质数的方法
            array.remove(i); // 删除质数元素
        }
    }
}

这里的问题一目了然:当你删除元素后,ArrayList的实际size()会变小,但你的循环还在按照最开始的total(比如116)来跑。当i走到116时,此时集合的实际大小已经是116了,而ArrayList的索引是从0开始的,最大索引只能到115,调用array.get(116)可不就直接越界报错嘛!

而且就算你改成i < array.size()这种实时判断的正向循环,也会有另一个坑:删除元素后,后面的元素会自动前移,导致你跳过一些元素的检查——比如删了i位置的元素,下一个元素会跑到i位置,但循环i会自增,直接跳过了这个元素。


靠谱解法1:用迭代器安全删除(首推)

ArrayList的迭代器专门处理了遍历+删除的场景,不会出现索引错位或者越界问题,这是Java集合操作的标准正确姿势:

public static void eratosthenes(ArrayList<Integer> array) {
    Iterator<Integer> it = array.iterator();
    while (it.hasNext()) {
        int num = it.next();
        if (isPrime(num)) {
            // 用迭代器的remove方法,而不是array.remove()
            it.remove();
        }
    }
    // 如果你还要对剩余元素重复这个过程,直接递归或者循环调用就行,迭代器的方式不会出问题
}

靠谱解法2:倒序遍历循环

倒序遍历的好处是,你删除当前位置的元素,不会影响前面还没遍历到的元素的索引(因为前面的元素索引都比当前i小,元素前移也不会碰到它们),而且循环条件用实时的array.size()也不会越界:

public static void eratosthenes(ArrayList<Integer> array) {
    // 从最后一个元素往前遍历
    for (int i = array.size() - 1; i >= 0; i--) {
        int num = array.get(i);
        if (isPrime(num)) {
            array.remove(i);
        }
    }
}

靠谱解法3:用临时集合存要保留的元素

如果你不想改遍历逻辑,也可以搞个临时集合,把不需要删除的元素(也就是非质数)存进去,最后替换原集合:

public static void eratosthenes(ArrayList<Integer> array) {
    ArrayList<Integer> keep = new ArrayList<>();
    for (int num : array) {
        // 保留非质数,对应你删除质数的逻辑
        if (!isPrime(num)) {
            keep.add(num);
        }
    }
    // 清空原集合,把临时集合的元素加回去
    array.clear();
    array.addAll(keep);
}

最后插个小提醒:埃氏筛的标准逻辑是保留质数,删除质数的所有倍数,如果你当前的逻辑是直接删除所有质数,可能和算法的目标搞反了哦~不过这是题外话,先把越界问题解决再说!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:21:46