我正在尝试编写代码,删除ArrayList
中的所有电影,然后将其删除,以便稍后可以将更多电影投入其中。
我将从代码开始:
for(int index = 0; index < movies.size(); index++){
removeMovie(movies, movies.get(index));
}
每次循环运行时,它都会递增index
,movies.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)。)
答案 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)
。后者需要搜索列表以找到要删除的对象,这将涉及再次遍历列表。