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()的不良行为[重复]