从数组中删除给定值的删除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为直。如果玩家想要保持单个四连胜,他们如何选择这个值的单个实例,以便验证该值是否在数组中?
答案 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])
但我认为第一种选择是最好的。 : - )