提问者:小点点

Ruby-如何从数组中弹出特定元素


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

a.delete(element)

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

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

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

a中删除其中一个名称,当它作为name中的示例出现时

但是,我打算使用多个示例,并使用a.delete()将一次删除所有元素,而不是像shuffle!生成的结果那样连续删除所有元素!。pop连续弹出元素,这样在选择相同的名称作为名称后,该名称就不能再从a中选择为样本。示例

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


共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"]

解决您的最后一个评论,您可以使用包括?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索引删除处带有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"]

另请参阅阵列的留档。

匿名用户

[..] 打算使用多个示例并使用a.delete()将一次删除所有元素,而不是像从shuffle!生成的结果那样连续删除!。pop连续弹出元素,以便在选择相同名称作为名称后,不再从中选择该名称作为样本。示例[…]

也许你看起来像这样?

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

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

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