我编写了这个程序来查找项目,然后删除所有小于项目的元素。没有编译错误,但是当我运行程序时,会出现以下消息。
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.remove(ArrayList.java:492)
at bb.deleteValues(bb.java:15)
at bb.main(bb.java:33)
Process completed. "
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class bb {
public static boolean deleteValues(ArrayList<Integer> list, int item)
{ int p =list.indexOf(item);
if(!list.contains(item))
return false;
else
for(int i=p; i<list.size();i++ )
{int n=list.get(i);
if (n>list.get(i+1))
list.remove(p);
list.remove(i+1);
}
return true;
}
public static void main(String[] args) {
ArrayList<Integer> a= new ArrayList<Integer>(8);
a.add(3);
a.add(10);
a.add(4);
a.add(5);
a.add(3);
a.add(2);
a.add(8);
a.add(6);
a.add(4);
if(deleteValues(a,4))
for(int x : a)
System.out.print(x+ " ");
}
}
答案 0 :(得分:2)
您的deleteValues
方法从i
循环p
到list.size()-1
,但循环的正文包含list.get(i+1)
和list.remove(i+1)
,所以当{{ 1}},i==list.size()-1
和list.get(i+1)
将尝试从列表中不存在的索引访问项目,这是异常的原因。
删除小于传递项的元素需要迭代列表中的所有元素,并将每个元素与传递的list.remove(i+1)
进行比较。请注意,当您从列表中删除第i个元素时,第(i + 1)个元素将成为新的第i个元素。这就是为什么只有在你不从列表中删除元素时我才会增加。
item
答案 1 :(得分:0)
list.remove(i+1);
将超过list
大小。例如,当您传递第4个元素时,它将在5th
postion
答案 2 :(得分:0)
问题出在您的deleteValues
函数中,当i
小于ArrayList
的大小时循环,但在调用get
函数时加1,可以和将导致IndexOutOfBoundsException
,因为它可以使i
等于ArrayList的大小,这是无效的。更改for循环,并删除i+1
的情况,如下所示:
for(int i=p; i<list.size();i++ )
{
int n=list.get(i);
if (n>list.get(i))
list.remove(p);
list.remove(i);
}
此外,如果您的函数旨在删除某个值的所有副本,则代码可以更简单,更简单,更清晰:
public static boolean deleteValues(ArrayList<Integer> list, int item)
{
if (list.contains(item))
{
for (int i = 0; i < list.size(); i++)
if (list.get(i) == item)
list.remove(i);
return true;
}
return false;
}
答案 3 :(得分:0)
import java.util.ArrayList;
import java.util.Scanner;
public class Ex {
public static boolean deleteValues(ArrayList<Integer> list)
{
for(int i=0; i<list.size();i++ )
{int n=list.get(i);
if (n>list.get(i+1))
// list.remove(i);
list.remove(i+1);
}
return true;
}
public static void main(String[] args) {
ArrayList<Integer> a= new ArrayList<Integer>(8);
a.add(3);
a.add(10);
a.add(4);
a.add(5);
a.add(3);
a.add(2);
a.add(8);
a.add(6);
// a.add(4);
if(deleteValues(a))
for(int x : a)
System.out.print(x+ " ");
}
}
你是在指定了itz大小的arraylist中添加了一个额外的对象,你在deleteValues方法中错误地使用了索引值,所以请检查这两个代码。
import java.util.ArrayList;
import java.util.Scanner;
public class Ex {
public static boolean deleteValues(ArrayList<Integer> list, int item)
{ int p =list.indexOf(item);
if(!list.contains(item))
return false;
else
for(int i=0; i<list.size();i++ )
{int n=list.get(i);
if (n>list.get(i+1))
list.remove(p);
//list.remove(i+1);
}
return true;
}
public static void main(String[] args) {
ArrayList<Integer> a= new ArrayList<Integer>(8);
a.add(3);
a.add(10);
a.add(4);
a.add(5);
a.add(3);
a.add(2);
a.add(8);
//a.add(6);
a.add(4);
if(deleteValues(a,4))
for(int x : a)
System.out.print(x+ " ");
}
}