在每个元素上调用remove()以清空ArrayList

时间:2015-10-31 01:39:39

标签: java for-loop arraylist

我正在尝试编写代码,删除ArrayList中的所有电影,然后将其删除,以便稍后可以将更多电影投入其中。

我将从代码开始:

 for(int index = 0; index < movies.size(); index++){
            removeMovie(movies, movies.get(index));
            }

每次循环运行时,它都会递增indexmovies.size()会减少。我需要保持movies.size()一致,同时仍然代表原始的ArrayList尺寸。所以,我希望它像“index&lt; ArrayListsOriginalSizeHereEvenThoughMyForLoopIsDecreasingItsSizeByRemovingMovies”

这是我刚才尝试过的事情:

int tempMovieSize = movies.size();
        for(int index = 0; index < tempMovieSize; index++){
            removeMovie(movies, movies.get(index));
            tempMovieSize += 1;
            }

这不起作用,因为我得到了一个异常的异常。它应该保持tempMovieSize的大小。 (它下降一个因为一个电影对象被移除,并且增加一个,取消它并保持原始值(在这种情况下为8)。)

4 个答案:

答案 0 :(得分:2)

您在每次循环迭代结束时递增循环索引。但这是错误的,因为如果您刚删除了一个元素,那么您最终将跳过以下元素。

要解决此问题,您不应在刚刚删除元素的迭代中增加循环索引。

修改:

由于您只想删除所有电影:

movies.clear();

答案 1 :(得分:1)

int size = movies.size();

int index=0;
while(index<size)
{
    removeMovie(movies, movies.get(index));

    index++;
}

另外,您可以使用ArrayList.remove(index)方法逐个删除元素

http://www.tutorialspoint.com/java/util/arraylist_remove.htm

int size= movies.size();

int index=0;

    while(index<size)
    {
        movies.remove(index);

        index++;
    }
顺便说一句,如果您只想删除列表中的所有元素,可以使用

movies.clear();

movies.removeAll();

另外,这里有一个很好的解释clear()和removeAll()方法是如何不同的。由于您是初学者,我认为这将真正帮助您理解这些概念。

答案 2 :(得分:0)

只需创建一个包含所有电影的while循环。然后说出类似

的内容
while (myMovieCollect.notEmpty()){
     removeMovie(myMovieCollect, myMovieCollect.get(0));
}

当然这是psudeoCode,但你明白了。

答案 3 :(得分:0)

问题

假设movies是一个大小为2的列表。使用原始代码,首先删除movies.get(0),留下大小为1的列表。第二次,index是1,movies.size()也是1,所以另一部电影不会被删除。

你的第二次尝试更成问题。每次循环,index增加1,tempMovieSize也增加1.因此,它是一个无限循环。

解决方法

正如其他人所说,movies.clear()是清空movies列表的最简单方法。

如果您确实需要在列表中的每个项目上调用removeMovie(…),并且您可以灵活地选择执行此操作的顺序,那么我建议您从结尾向后迭代:

for (int index = movies.size() - 1; index >= 0; index--) {
    removeMovie(movies, i);
}

一个优点是您只需要拨打movies.size()一次。另一个是你总是删除列表的最后一个元素。删除ArrayList的第一个元素效率很低,因为需要复制所有后续元素以填充空白。

请注意,我已更改removeMovie(…)以获取索引,因此它可以movies.remove(index)而不是movies.remove(object)。后者需要搜索列表以找到要删除的对象,这将涉及再次遍历列表。