Arraylist java.lang.IndexOutOfBoundsException:索引3超出长度3的界限错误
我创建了一个方法,它接受字符串的Arraylist java.lang.IndexOutOfBoundsException:索引3超出长度3的界限错误,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,我创建了一个方法,它接受字符串的Arraylist和整数。它将删除所有长度小于给定整数的字符串 例如: Arraylist=[“abcde”、“aabb”、“aaabb”、“abc”、“ab”] 整数=4 因此新的Arraylist应该是:[“abcde”、“aabb”、“aaabbb”] 但我收到了这个错误信息: 线程“main”java.lang.IndexOutOfBoundsException中的异常:索引3超出长度3的界限 这是我的密码: publicstaticvoidmain(字符
Arraylist
和整数。它将删除所有长度小于给定整数的字符串
例如:
Arraylist=[“abcde”、“aabb”、“aaabb”、“abc”、“ab”]
整数=4
因此新的Arraylist
应该是:[“abcde”、“aabb”、“aaabbb”]
但我收到了这个错误信息:
线程“main”java.lang.IndexOutOfBoundsException中的异常:索引3超出长度3的界限
这是我的密码:
publicstaticvoidmain(字符串[]args){
ArrayList newArrayList=新ArrayList();
添加(“string1”);
添加(“string2”);
newArrayList.添加(“rem”);
newArrayList.add(“dontremove”);
removeElement(newArrayList,4);//新arraylist必须=[string1,string2,dontremove]
}
公共静态void removeElement(ArrayList ArrayList,int-inputLen){
int arrayLen=arraylist.size();
对于(int i=0;i
问题是索引的值为4
但是一旦你从列表中删除一个项目,你现在只有3个条目
因此,在您的循环中,当您尝试访问第四个条目时,您现在将得到一个IndexOutOfBounds
错误
解决方案是从ArrayList的末尾开始,然后倒计时到0
For (int i = arrayLen - 1; i >= 0; i--)
在循环内部,您不需要:
i--;
您在对列表的索引进行迭代时正在修改列表。一旦删除第一项,列表将比您预期的短,并且一旦达到原始最后一个元素的索引,就会出现此错误。幸运的是,该方法可以为您完成繁重的工作:
public static void removeElement(List<String> arraylist, int inputLen) {
arraylist.removeIf(s -> s.length() < inputLen);
System.out.println("New Arraylist: " + arraylist);
}
publicstaticvoidremoveelement(列表arraylist,int-inputLen){
arraylist.removeIf(s->s.length()
移除元素时,数组的长度应该改变。arrayLen
变量存储数组的长度,但当数组的长度缩小时不会改变。要改变它,您应该能够用arrayList.size()替换arrayLen
,当您删除元素时,该值将发生变化您正在从0循环到数组大小4。在循环中,您正在删除项目,因此数组大小将小于4,因此您将获得此异常。
尝试这样循环:
Iterator<String> iterator = arraylist.iterator();
while (iterator.hasNext()) {
String word = iterator.next();
if (word.length() < inputLen) {
iterator.remove();
}
}
Iterator Iterator=arraylist.Iterator();
while(iterator.hasNext()){
String word=iterator.next();
if(word.length()
No,解决方案是使用迭代器。您的建议仍然可能抛出ConcurrentModificationException
@chrylis-cautiouslyoptimistic-,不,它不会抛出ConcurrentModificationException。它不使用foreach。代码所做的只是访问ArrayList中的一项。ArrayList不知道或不关心代码是否正确在循环中执行。啊,请尽量更正。感谢您的帮助。除了逻辑错误之外,名称removeElement
表示您的方法将删除第4个元素。相反,类似removeElementsLongerThan的名称将更有助于人们阅读您的代码。此外,您通常不应是变量和参数,如ArrayList
;。正确,但OP的总体代码风格表明,实现removeIf
的功能是练习的重点。是的,我知道这是解决这个问题的另一种方法。但我想用我使用的方法解决这个问题。比如使用“for”声明。非常感谢您的帮助。
Iterator<String> iterator = arraylist.iterator();
while (iterator.hasNext()) {
String word = iterator.next();
if (word.length() < inputLen) {
iterator.remove();
}
}