【问题标题】:How to remove only a single instance of a value from an array in Ruby?如何从Ruby中的数组中只删除一个值的单个实例?
【发布时间】:2016-09-02 12:08:55
【问题描述】:

删除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 用于顺子。如果玩家想要保持一个四为顺子,他们如何选择这个值的单个实例以使该值被验证为在数组中?

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    您可以使用#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])
    

    但我认为第一个选项是最好的。 :-)

    【讨论】:

    • 这样就可以了。写下条件描述后,我想我应该意识到这将是一个双重功能 - 谢谢!
    • @Mr.Kennedy 似乎很奇怪,没有更优雅的 Ruby 风格的方法来做这件事,但我想这是必须要做的!
    • 很高兴听到这不仅仅是我。我(显然)对 Ruby 很陌生,但尤其是在看了这个之后:youtu.be/3wIDoPmmpdo 我想会有一个更 Rubylicious 的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多