从 ArrayList 中删除项目时出错 [重复]
Posted
技术标签:
【中文标题】从 ArrayList 中删除项目时出错 [重复]【英文标题】:Error removing an item from an ArrayList [duplicate] 【发布时间】:2013-03-29 09:20:42 【问题描述】:我正在尝试使用线程从列表中删除一个值。但是代码失败并给出了异常。请帮助我是线程编程的初学者.....
这是Test.java
的内容
import java.util.*;
public class Test
private static final List<Integer> Values = new ArrayList<Integer> ();
public static void main(String args[])
TestThread t1 = new TestThread(Values);
t1.start();
System.out.println(Values.size());
这是TestThread.java
的内容
import java.util.*;
public class TestThread extends Thread
private final List<Integer> Values;
public TestThread(List<Integer> v)
this.Values = v;
Values.add(5);
public void run()
Values.remove(5);
System.out.println("5 removed");
【问题讨论】:
什么是异常,是哪一行导致的? 1 线程“Thread-0”中的异常 java.lang.IndexOutOfBoundsException:索引:5,大小:1 在 java.util.ArrayList.rangeCheck(ArrayList.java:603) 在 java.util.ArrayList .remove(ArrayList.java:444) 在 TestThread.run(TestThread.java:12) 【参考方案1】:这一行的意思是:删除索引 5 处的值。但是索引 5 中什么都没有。
Values.remove(5);
当前数组中只有 1 个值,因为此行表示将值 5 添加到我的列表中,而不是添加 5 个值到我的列表中。
Values.add(5);
您的错误很可能是IndexOutOfBoundsException
。如果您显示列表的大小,您会更清楚地看到它。
public void run()
System.out.println(Values.size()); // should give you 1
Values.remove(5);
System.out.println("5 removed");
看起来是这样的:
当它被插入时,5 被自动装箱到一个 Integer 对象中。因此,要成功删除它,您应该将其包装成一个:new Integer(5)
。然后发出删除调用。然后它将调用remove 的重载版本,该版本接受一个Object,而不是int。
Values.remove(new Integer(5));
表示从我的列表中删除名为“5”的整数对象。
【讨论】:
+1 很好的解释:)【参考方案2】:List#remove(int)
方法从列表中删除指定位置的元素,因此Values.remove(5)
将尝试删除索引 5 处确实存在的元素。这里 int
的值 5 不会被自动装箱,因为 List#remove(int)
已经存在。
你应该使用List#remove(Object o)
,实际上是Values.remove(new Integer(5))
。
public void run()
Values.remove(new integer(5));
System.out.println("5 removed");
【讨论】:
【参考方案3】:您对Values.remove(5);
的调用并未达到您的预期。您传入参数的 int 是一个索引值,因此它试图删除数组列表中索引 5 处的项目,但其中只有 1 个值。
使您能够删除给定值的整数的解决方法
int given = 5;
for (int curr = 0; curr < Values.size(); curr++)
if (Values.get(curr) == given)
Values.remove(given);
【讨论】:
【参考方案4】:List (ArrayList) 中有 2 个remove
方法(重载)
remove(int)
--> 表示在索引处删除
remove(Object)
--> 表示从列表中删除特定对象
当您说Values.remove(5)
时,编译器将5 作为int
并调用remove(int)
方法,该方法试图删除索引5 处的值存储。由于索引5,dint 有任何值IndexOutOfBoundException
被扔了。
要解决它,比如remove(new Integer(5))
,要编译器,调用 remove(Object) 方法。
请参阅此SO thread 以获得更清晰的信息。
【讨论】:
以上是关于从 ArrayList 中删除项目时出错 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
尝试将数组添加到 Java 中的 ArrayList 时出错 [重复]
从 ArrayList 的 ArrayList 中删除重复项 [重复]