Java ArrayList.remove()方法无效?

4
我有一个测验程序,但是其中的一小部分没有工作。基本上,我有一个ArrayList<Object>,它保存着10个(或更多,不重要)问题对象,我可以在以后参考它们。
无论如何,当我想使用ArrayList.remove(index)时,它并没有删除那个对象!我真的不知道该怎么办。
(关键搜索是另一个类,它接受一个字符串(关键字),并在测验数组列表中搜索它。它返回一个不包含关键字的问题列表,因此让我从整体问题数组中删除它们。)
        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。 - Jason
你能否添加“问题”代码以进一步澄清? - thegauravmahawar
1
请确保您的 remove 使用整数,因为对象将作为键而不是索引进行删除(可能找不到键)。 - CosmicGiant
嗯,当我硬编码数字而不是使用“indexAt.get(i)”时,它可以工作。为什么我的类型为Integer的indexAt不能工作呢? - Jason
1
我认为你在这里并没有按索引进行删除。由于“indexAt”返回Object的子类型,它可能会尝试从“Questions”列表中删除传递的对象。(换句话说,我认为它没有将整数解包为int) - Tom
附注:Questions没有遵循Java的变量命名规范。 - CosmicGiant
1个回答

9

参见ArrayList#remove(Object)

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

ArrayList#remove(int):

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

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

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

但是你还要按照 indexAt 的降序排序。

这太完美了!现在它有意义了。现在,当我在for循环中使用它时,remove显然会删除特定位置,但在下一次迭代中,位置将会混乱。 - Jason
@Jason的“将任何后续元素向左移动(从它们的索引中减去一个)”可能会导致您当前实现的问题。只是提醒一下。 - CosmicGiant
@AlmightyR 没错.. - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接