【问题标题】:Unexpected behavior when removing items from ArrayList从 ArrayList 中删除项目时的意外行为
【发布时间】:2012-03-23 02:38:03
【问题描述】:

在我的 Android 应用 Java 代码中,我有一个自定义数据类型的 ArrayList。根据我对ArrayLists 的了解,当您执行ArrayList.remove(location) 时,位于位置上方的所有项目都会向下移动一个。但是由于某种原因,当我从数组的末端向后迭代以删除数组中的选定项目时,每次删除项目时,它下面的所有项目都会向上移动一个,而不是较高项目的正常行为下移一位。因此,当我删除数组中间的第一项时,0 处的项变为 1 并且 0 变为空。有没有什么特别我可以做的事情或某种情况会导致这种情况发生?


对于我不清楚自己在做什么,我深表歉意。我没有遍历 ArrayList。但相反,我有另一个列表,其中包含我需要删除的原始列表中的所有项目。我在第二个列表上执行 Collections.sort 并在第二个列表上从头开始迭代,并且在每次迭代中我执行 ArrayList.remove 一个第一个列表,位置从第二个列表中读取。因此,移除从最高位置到最低位置,我认为这将防止每次移除时发生较低项目的任何变化。但我看到发生的是低于被移除项目的项目都被向上移动以填补空白。为什么会这样?

【问题讨论】:

  • 这种情况不是Android特有的,一般Java都适用。
  • 请出示代码。它比描述你在做什么更清楚。更重要的是,您的代码可能不会做它应该做的事情。
  • @FabianBarney:这是您投票结束问题时自动生成的评论。老实说,这不是我写的!
  • @LukeWoodward:但您可以编辑或删除评论。
  • @LukeWoodward 不知道。把手放下。 :)

标签: java android


【解决方案1】:

如果您需要遍历列表并从列表中删除项目,请尝试使用迭代器和 while 循环。 Iterator 接口定义了一个 remove() 方法,该方法从被迭代的 Collection 中删除使用 next() 检索到的最后一项。

List list = new ArrayList( );
Iterator iter = list.iterator( );

while ( iter.hasNext( ) )
{
  Object item = iter.next( );

  if ( shouldDelete( item ) )
  {
    iter.remove( );
  }
}

【讨论】:

    【解决方案2】:

    所以当我删除列表中间某处的项目时,0 处的项目移动到 1,然后 0 变为 null。为什么会这样?

    这不应该发生,肯定是有其他问题。请发帖SSCCE

    我建议你这样解决它:

    firstList.removeAll(secondList);
    

    【讨论】:

      【解决方案3】:

      您似乎只对第二个列表进行排序,所以我对您的结果并不感到惊讶。由于第一个列表未排序,因此您不会以相反的顺序遍历它,并且可能会出现奇怪的变化。

      为什么不使用列表迭代器遍历第一个列表,如果该项目包含在第二个列表中,则使用迭代器将其从第一个列表中删除?

      或者更好的是,使用ArrayList#removeAll<Collection<?> c) 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 2023-03-15
        • 2013-08-31
        相关资源
        最近更新 更多