从 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 的 ArrayList 中删除重复项 [重复]

尝试将数组添加到Java中的ArrayList时出错[重复]

如何从 ArrayList 中删除重复的元素?

JAVA中如何从ArrayList中删除重复对象