【问题标题】:Why need to shift elements of ArrayList to the left after removing an element?为什么删除一个元素后需要将 ArrayList 的元素向左移动?
【发布时间】:2019-01-04 12:24:04
【问题描述】:

据我所知,以下是删除 ArrayList 中元素的步骤。

  1. 无需对目标元素做任何事情
  2. 从删除元素后的 1 到最后一个元素沿数组迭代
  3. 将每个元素复制到位置 1 之前
  4. 将最后一个元素设置为null

为什么不直接将我们要删除的元素设置为null?只需一步。

谁能解释上述方案的优点?提前致谢。

【问题讨论】:

  • 把列表想象成一本书,所有页面都写着。删除一个元素就像从书中删除一个页面。您提出的建议更像是擦除页面上的内容 - 这根本不是同一个操作。 (如果您的特定用例很好,列表的大小保持不变等,那么只需致电list.set(index, null) - 但在大多数情况下,这不是必需的。)
  • 就是remove和replace的区别。在后一种情况下,您可以将元素替换为空对象。
  • @DaisyShipton 这将是一个很好的答案;-)
  • 因此,如果列表中的null 表示该索引处的元素已“删除”,那么如果我想实际上null 存储为元素怎么办?您如何区分已删除的元素和 实际 null 元素?。
  • 您知道ArrayList 有一些remove 方法 - 不必执行所有这些步骤! (这些是数组所必需的)-null 是放入 ArrayList 的有效元素,程序员为什么需要它

标签: java list loops arraylist null


【解决方案1】:

因为这些不一样(让我们删除"c"):

  • ["a", "b", "d", "e"]
  • ["a", "b", null, "d", "e"]

拆和换有很大区别:

  • 移除会更改索引、移除元素并移动(影响)其余元素。这也会改变列表的大小。前任。元素 "d" 可通过索引 2 访问(从 3 移出)。
  • 替换替换项目并保持元素的索引并且列表的大小也保持不变。前任。元素 "d" 可通过索引 4 访问(未更改)。

【讨论】:

  • “删除和替换有很大的区别。” 切中要害。 +1。
  • 也可能是“允许null列表中的元素”或者“如何区分想要的null和删除的null占位符(左右)”
  • null 总是允许在列表中(根据列表的定义)。没有办法区分想要的和不需要的null。如果要保留索引,可以将“c”替换为“假对象”en.wikipedia.org/wiki/Null_object_pattern
【解决方案2】:

为什么不直接将我们要移除的元素设置为 null?

将一个元素“设置”为 null 并不是删除一个元素,而是替换一个元素。

这种方法还有另一个问题,如果列表中的null 意味着该索引处的元素被“删除”,那么如果我想将null 实际存储为元素怎么办?您如何区分已删除的元素和实际的 null 元素?

利用List<T> API 中的remove 方法,不要试图重新发明轮子,因为它们已经尽其所能。

【讨论】:

  • '似曾相识'! [:-) 恕我直言,“有人可以解释上述方案的优点吗?”
  • @CarlosHeuberger 也惊叹于法语字符 :)。只是想指出将元素设置为 null 时可能出现的另一个问题。
  • 我刚刚注意到我刚刚评论了这个问题(以及 Nikolas 的回答)
  • 感谢您的回答,我意识到我在“替换(使用 null)”和“删除”之间感到困惑。看来我的问题中描述的方案通常是所谓的“删除”。现在明白了。非常感谢。
【解决方案3】:

...因为这就是列表的工作方式。许多用例需要这种动态调整大小的行为,所以 Java has an interface for the List conceptArrayList 是 List 的几个实现之一,LinkedList 是另一个。

我们已经有了您所描述的行为,the Array - 所以您需要该行为的地方,您可以使用 String[]

【讨论】:

    【解决方案4】:

    ArrayLists 就像数组一样,有一个区别——它们是可调整大小的(在本例中无关紧要)。
    考虑以下数组:[ref1,ref2,ref3,ref4],其中 ref1:4 是对某些对象的引用。这意味着它们不包含对象本身,它们只指向对象。现在,如果您想删除 ref2,例如通过将其声明为 null,这意味着它现在不会指向任何对象(ref2 = null),但这并不意味着引用本身消失。您的新数组(ArrayList)将是[ref1,null,ref3,ref4] 现在。你看?替换和删除是有区别的......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多