【问题标题】:Calling a remove() on every element to empty an ArrayList在每个元素上调用 remove() 以清空 ArrayList
【发布时间】:2015-10-31 01:39:38
【问题描述】:

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

我将从代码开始:

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

每次循环运行时,index 都会增加,movies.size() 应该会减少。我需要保持movies.size() 一致,同时仍代表原始ArrayList 大小。所以,我希望它像“index


这是我刚刚尝试过的:

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

这不起作用,因为我遇到了一个 outofbounds 异常。它应该保持tempMovieSize 的大小。 (它减一是因为移除了一个电影对象,然后加一,将其抵消并保持在原始值(在本例中为 8)。)

【问题讨论】:

  • 不,你没有。要么运行循环,直到 movies.size()0,始终删除第一个元素,或者更好的是,使用 Iterator 并且它是 remove 功能
  • 你过于复杂了。它不会在每次循环时计算tempMovieSize

标签: java for-loop arraylist


【解决方案1】:

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

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

编辑:

因为您只是想删除所有电影:

movies.clear();

【讨论】:

    【解决方案2】:
    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() 方法有何不同的精彩解释。由于您是初学者,我认为这将真正帮助您理解这些概念。

    【讨论】:

      【解决方案3】:

      问题

      假设 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(<i>index</i>) 而不是movies.remove(<i>object</i>)。后者需要在列表中搜索以定位要删除的对象,这将涉及再次遍历列表到末尾。

      【讨论】:

        【解决方案4】:

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

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

        当然这是伪代码,但你明白了。

        【讨论】:

        • index 替换为0(如果我没记错的话)。每次删除一个元素时,下一个移动的元素都会占据它的位置
        猜你喜欢
        • 2020-05-18
        • 1970-01-01
        • 2015-06-15
        • 2015-12-11
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        相关资源
        最近更新 更多