如何从Ruby中的数组中只删除一个值的实例?

时间:2016-09-02 03:35:35

标签: arrays ruby

从数组中删除给定值的删除methods似乎都删除了所提供值的每个实例。在不知道其位置的情况下,我怎么才能删除单个实例?

foo = 4,4,3,2,6
foo -= [4]
p foo # --> [3, 2, 6]

我用foo.delete(4)

得到了相同的结果

我可以查询数组以辨别其中是否存在值的实例并计算实例数:

foo = 4,4,3,2,6
foo.include?(4) # <-- true
foo.count(4)    # <-- 2

例如,如果为Yahtzee游戏制作了一系列骰子卷:

roll_1 = Array.new(5) {rand(1..6)}

并且结果值为[4,4,3,2,6],玩家可能想要同时选择四个,或者,2,3,和4为直。如果玩家想要保持单个四连胜,他们如何选择这个值的单个实例,以便验证该值是否在数组中?

1 个答案:

答案 0 :(得分:2)

您可以使用#index(或#find_index)查找第一个匹配元素的索引,并使用#delete_at(或#slice!)删除该元素:

foo.delete_at(foo.index(4))

Here是讨论此问题的另一个主题。他们建议添加一个警卫,以防被搜索的值没有出现在数组中:

foo.delete_at(foo.index(4) || foo.length)

您可以使用标志变量和#delete_if,直到翻转标志:

flag = false
foo.delete_if { |i| break if flag; !flag and i == 4 and flag = true }

您可以将数组分区为匹配项和不匹配项,删除其中一项匹配项,然后重新协调该数组:

matches, foo = foo.partition { |i| i == 4 }
foo.concat(matches[0..-2])

但我认为第一种选择是最好的。 : - )