arraylist java.lang.indexoutofboundsexception:索引3超出长度3的界限错误

yvgpqqbh  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(437)

我创建了一个方法 Arraylist 字符串和整数的组合。它将删除所有长度小于给定整数的字符串。
例如:
arraylist=[“de”,“aabb”,“aaabbb”,“”,“ab”]
整数=4
所以新的 Arraylist 应该是:[“de”,“aabb”,“aaabbb”]
但我得到了一个错误信息:
线程“main”java.lang.indexoutofboundsexception中出现异常:索引3超出长度3的界限
这是我的密码:

public static void main(String[] args){
        ArrayList<String> newArrayList = new ArrayList<>();
        newArrayList.add("string1");
        newArrayList.add("string2");
        newArrayList.add("rem");
        newArrayList.add("dontremove");
        removeElement(newArrayList, 4); // new arraylist must be = [string1, string2, dontremove]
    }

    public static void removeElement(ArrayList<String> arraylist, int inputLen){
        int arrayLen = arraylist.size();
        for(int i=0; i<arrayLen; i++){
            if(arraylist.get(i).length() < inputLen){
                arraylist.remove(i);
                i--;
            }
        }
        System.out.println("New Arraylist: " + arraylist);
    }

这个代码怎么了?

qybjjes1

qybjjes11#

您正在从0循环到数组大小4。在循环中,您正在删除项,因此数组的大小小于4,因此会出现此异常。尝试这样循环:

Iterator<String> iterator = arraylist.iterator();

while (iterator.hasNext()) {
    String word = iterator.next();
    if (word.length() < inputLen) {
        iterator.remove();
    }
}
7fhtutme

7fhtutme2#

您正在修改列表,同时对其索引进行迭代。删除第一项后,列表将比预期的要短,一旦到达原始最后一个元素的索引,就会出现此错误。幸运的是 removeIf 方法可以为您做举重:

public static void removeElement(List<String> arraylist, int inputLen) {
    arraylist.removeIf(s -> s.length() < inputLen);
    System.out.println("New Arraylist: " + arraylist);
}
f0ofjuux

f0ofjuux3#

删除元素时,数组的长度应该更改。这个 arrayLen 变量存储数组的长度,但当数组的长度收缩时不会更改。要改变它,你应该能够仅仅替换 arrayLenarrayList.size() ,将在删除元素时更改

ej83mcc0

ej83mcc04#

int arrayLen = arraylist.size();

问题是索引的值是4。
但是一旦你从列表中删除一个条目,你现在只有3个条目。
因此,在您的循环中,当您尝试访问第4个条目时,您现在将得到一个 IndexOutOfBounds 错误。
解决方案是从arraylist的末尾开始,然后倒计时到0。

For (int i = arrayLen - 1; i >= 0; i--)

在循环中,你不需要:

i--;

相关问题