[英]How to fix ArrayList java.lang.IndexOutOfBoundsException: Index 20 out-of-bounds for length 2
[英]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.