Java ArrayList.remove() 不起作用? [复制]

Posted

技术标签:

【中文标题】Java ArrayList.remove() 不起作用? [复制]【英文标题】:Java ArrayList.remove() isn't working? [duplicate] 【发布时间】:2016-04-01 02:32:53 【问题描述】:

我有一个测验程序,但一小部分无法运行。基本上,我有一个ArrayList<Object>,其中包含 10 个(或更多,没关系)我可以稍后参考的问题对象。

无论如何,当我想使用ArrayList.remove(index) 时,它不会删除那个对象!老实说,我不知道该怎么办。

(Key Search 是另一个接受字符串 (key) 并在测验数组列表中搜索它的类。它返回一个不包含关键字的问题的数组列表,从而让我将它们从整个问题数组中删除.)

        ArrayList<Integer> indexAt = new ArrayList();
        indexAt = keyWord.indexAt(); //returning the questions that need to be removed
        System.out.println("(1) Number of Questions: " + Questions.size()); //debugging
        for(int i = 0; i < indexAt.size(); i++)
        

            Questions.remove(indexAt.get(i));

        

        //prints out the questions that were removed (for my own reasoning)
        for(int i = 0; i < indexAt.size(); i++)
        

            System.out.println(indexAt.get(i));
        

        System.out.println("(2) Number of Questions: " + Questions.size()); //debugging

        Sorting sort = new Sorting(Questions);

输出如下所示:


(1) 问题数:10

1

2

3

4

6

(2) 问题数:10


它应该删除索引 1,2,3,4,6!!

【问题讨论】:

那么我的问题数不应该是 5,因为我从 Questions 数组列表中删除了 1、2、3、4、6,因此,当我使用 Questions.size() 时,它应该返回5,不是 10 能否添加Questions的代码以进一步澄清? 确保您的 remove 使用整数,因为对象将作为键而不是索引删除(可能找不到键)。 嗯,当我用数字而不是“indexAt.get(i)”进行硬编码时,它正在工作。为什么我的 indexAt(整数类型)不起作用..) 我不认为你在这里按索引删除。由于“indexAt”返回了 Object 的子类型,它可能会尝试从“问题”列表中删除传递的对象。 (换句话说,我认为它不会将整数拆箱为 int) 【参考方案1】:

见ArrayList#remove(Object):

从该列表中删除第一次出现的指定元素(如果存在)。如果列表不包含该元素,则它不变。更正式地说,删除具有最低索引的元素 i 使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含指定的元素(或等效地,如果此列表因调用而更改),则返回 true

和ArrayList#remove(int):

删除此列表中指定位置的元素。将任何后续元素向左移动(从它们的索引中减去 1)。

您使用第一种方法,但您可以轻松更改它:

Questions.remove(indexAt.get(i).intValue());

但您还订购了您的indexAt 降序。

【讨论】:

这太完美了!现在它是有道理的。现在,当我在 for 循环中使用它时,remove 显然会删除特定位置,但在下一次迭代中,这些位置会被弄乱 @Jason " 将任何后续元素向左移动(从它们的索引中减去一个)。" 可能会导致您当前的实现出现问题。请注意。 @AlmightyR 完全正确..

以上是关于Java ArrayList.remove() 不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java中ArrayList remove()的不良行为[重复]

ArrayList.add 有效,但 ArrayList.remove 无效

ArrayList remove注意事项

类集框架解析

HashMap要点总结

在recyclerview中删除和刷新