【问题标题】:Using delete_at in an array loop with Ruby在 Ruby 的数组循环中使用 delete_at
【发布时间】:2011-02-22 08:34:55
【问题描述】:

我是否正确地说在遍历数组时使用 delete_at 很危险?如下情况,删除后退出循环和函数怎么办?

arr.each_index do |i|
  if arr[i] == 5
    arr.delete_at(i)
    return
  end
end

【问题讨论】:

  • 为什么只删除第一个5,而不是全部?
  • 5其实是一个地名,在数据库中多次存在。检测到重复后,将根据用户选择将其删除并替换为更具体的名称。然后重新提交以进一步澄清重复的地名。我只想一次做一个,所以一次只要求用户澄清一个地名。希望这是有道理的。

标签: ruby arrays loops


【解决方案1】:

您所说的“危险”来自尝试迭代到您正在修改的数组部分。如果您只执行一次修改,然后立即退出迭代,那么没有问题。

当然,您的实际示例可以更简单地完成:

arr.delete_at(arr.index(5))

在安全问题上,如果您反向迭代,通常可以在迭代时删除,这很有用,因为在这种情况下,您是在迭代之后更改内容,而不是在迭代之前...

【讨论】:

  • 不确定您的示例与我的示例有何相同?因为我只想在退出之前删除第一次出现的 5。
  • 没错。 arr.index(5) 找到前 5 个的位置,然后 arr.delete_at 只删除该位置的元素。不要将此与 arr.delete(5) 混淆,后者删除所有 5。
  • 迭代时删除并不很好,因为在当前位置后面删除会导致跳过下一个位置。
【解决方案2】:

如果你想删除所有5s,而不仅仅是第一个,你可以这样做

new_arr = arr.reject{|x| x == 5}

或者,如果您可以修改现有数组,

arr.reject!{|x| x == 5}

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 2014-09-25
    • 2013-12-17
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2016-11-05
    相关资源
    最近更新 更多