【问题标题】:Ruby - how to pop a specific element from an arrayRuby - 如何从数组中弹出特定元素
【发布时间】:2019-04-20 16:42:24
【问题描述】:

在 Ruby 中,从数组中弹出特定元素的最简单方法是什么,类似于 .delete 方法

a.delete(element)

而不是弹出第一个/最后一个元素或使用 .slice?

为了更具体:例如,我可以这样做

case names.sample when "John", "Dave", "Sam"
  a.delete(names.sample)
end

a 中删除其中一个名称,当它作为来自names 的样本出现时

但是,我打算使用多个样本并使用a.delete()将一次删除所有元素,而不是像shuffle!.pop产生的结果那样连续弹出元素,因此名称不能再在同名被选为name.sample后,从a中选为样本

我想知道在 Ruby 中连续弹出这些元素的最简单方法是什么,或者在这种情况下是否有可能。

【问题讨论】:

  • 不知道我明白你在问什么。你知道 .pop 方法存在于 ruby​​ 中吗? a.pop(index)
  • 对不起,我知道措辞可能令人困惑。我的意思是,如果有一种方法可以实现与使用 `a.pop(element)` 相同的结果,根据我的研究,除非用于指示弹出多少元素,否则这似乎不是一件事。而 `a.delete(element)` 可用于运行类似 'a.delete(name.sample)' 的内容,作为“if”语句的一部分,如果这有意义的话。
  • 我不明白你的问题,我认为我并不孤单。应该不难说它是完整和明确的,但如果你有困难,请至少包括一些例子。确保为每个示例显示预期或期望的结果,并确保所有输入和输出都是有效的 Ruby 对象。更一般地说,当要求澄清问题时,请编辑您的答案,而不是尝试在 cmets 中详细说明(并非所有读者都能看到)。
  • 感谢您的建议。正如您可能会说的那样,我是该网站的新手。在回复评论后,我确实在原始问题中进行了编辑并包含说明和示例,因此现在应该会显示出来。

标签: ruby


【解决方案1】:

[..] 打算使用多个样本并使用a.delete() 将一次删除所有元素,而不是像shuffle!.pop 产生的结果那样连续弹出元素,因此名称不能再同名被选为name.sample[..]

也许你看起来像这样?

names = ["John", "Dave", "Sam"]

names.size.times { p names.delete(names.sample) }

#=> "Sam"
#=> "John"
#=> "Dave"

【讨论】:

  • 谢谢,这很有效。
【解决方案2】:

Array 类定义了一个pop 方法。它返回并删除数组中的最后一个元素。

a = ["a", "b", "c"]
puts a.pop #=> "c"
puts a     #=> ["a", "b"]

您可以选择将参数传递给pop,指定要弹出多少元素。

a = ["a", "b", "c"]
puts a.pop(2) #=> ["b", "c"]
puts a        #=> ["a"]

解决您的最后一条评论,您可以使用include?indexdelete_at 方法来实现此目的。假设您正在检查数组中的“b”:

a = ["a", "b", "c"]

value_index = a.index("b") #Returns the first occurring index of "b"
has_value = a.include?("b") #Returns whether "b" is in the list
a.delete_at(a.index("b")) if has_value #Removes "b" from the list

在此示例中,“has_value”将是a 数组是否包含值“b”,而“value_index”将是“b”的第一次出现。这也会从列表中删除值“b”。

如果您想删除 所有 次出现的“b”,您可以使用 include?indexdelete_at 和 while 循环:

a = ["a", "b", "c", "a", "b", "c"]

while a.include?("b")
    a.delete_at(a.index("b"))
end
#a will now be ["a", "c", "a", "c"]

另见the documentation for Array

【讨论】:

  • 我会把最后一个写成 a.count("b").times { a.delete_at(a.index("b")) }。或查看here 以获得更好的基准解决方案。
  • 这种方法也行得通,几乎任何事情都有不止一种方法。
  • while a.include?("b"); a.delete_at(a.index("b")); end 只是a.delete("b")的一种精心制作的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多