繁体   English   中英

Arraylist java.lang.IndexOutOfBoundsException:索引 3 超出长度 3 错误的范围

[英]Arraylist java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3 Error

我创建了一个方法,它采用Arraylist字符串和 integer。 它将删除所有长度小于给定 integer 的字符串。

例如:

Arraylist = [“abcde”,“aabb”,“aaabbb”,“abc”,“ab”]

integer = 4

所以新的Arraylist应该是:["abcde", "aabb", "aaabbb"]

但我收到此错误消息:

线程“主”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);
    }

这段代码有什么问题?

您正在从 0 循环到数组的大小,即 4。在循环内,您正在删除项目,因此数组的大小变得小于 4,因此您会遇到此异常。 尝试像这样循环:

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

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

您正在修改列表,同时迭代其索引。 删除第一项后,列表将比您预期的要短,一旦到达原始最后一个元素的索引,您将收到此错误。 幸运的是, removeIf方法可以为您完成繁重的工作:

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

问题是您的索引值为 4。

但是,一旦您从列表中删除一个项目,您现在只有 3 个条目。

因此,在您的循环中,当您尝试访问第 4 个条目时,您现在将收到IndexOutOfBounds错误。

解决方法是从 ArrayList 的末尾开始,倒数到 0。

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

在循环内你不需要:

i--;

删除元素时,数组的长度应该会改变。 arrayLen变量存储数组的长度,但在数组长度缩小时不会改变。 要更改它,您应该能够将arrayLen替换为arrayList.size() ,当您删除元素时它会改变

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM