为了账号安全,请及时绑定邮箱和手机立即绑定

检查Ruby中的数组中是否存在值

/ 猿问

检查Ruby中的数组中是否存在值

米琪卡哇伊 2019-10-23 12:50:32

我有一个值'Dog'和一个数组['Cat', 'Dog', 'Bird']

如何检查它是否存在于数组中而不遍历它?有没有简单的方法检查值是否存在,仅此而已?


查看完整描述

3 回答

?
慕瓜9086354

您正在寻找include?:


>> ['Cat', 'Dog', 'Bird'].include? 'Dog'

=> true


查看完整回答
反对 回复 2019-10-23
?
素胚勾勒不出你

有一种in?方法在ActiveSupport(滑轨的一部分),因为V3.1,如通过@campaterson指出。因此,在Rails中,或者,如果您可以require 'active_support',您可以编写:


'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false

OTOH,Ruby本身没有in运算符或#in?方法,即使以前已经提出过,特别是由红宝石核心的顶尖成员远藤裕介提出的。


如其他人指出的那样,反向方法include?存在,对所有Enumerables ^包括Array,Hash,Set,Range:


['Cat', 'Dog', 'Bird'].include?('Unicorn') # => false

请注意,如果您的数组中有很多值,则将一个接一个地检查所有值(即O(n)),而对哈希的查找将是固定时间(即O(1))。因此,例如,如果数组是常量,则最好使用Set。例如:


require 'set'

ALLOWED_METHODS = Set[:to_s, :to_i, :upcase, :downcase

                       # etc

                     ]


def foo(what)

  raise "Not allowed" unless ALLOWED_METHODS.include?(what.to_sym)

  bar.send(what)

end

一个快速测试表明,调用include?一个10元的Set约3.5倍比调用它的等效快Array(如果未找到该元素)。


最后的闭注:使用时要小心include?上Range,也有细微之处,所以要参考的文档,并与比较cover?...


查看完整回答
反对 回复 2019-10-23
?
潇潇雨雨

用途Enumerable#include:


a = %w/Cat Dog Bird/


a.include? 'Dog'

或者,如果完成了许多测试,则1可以摆脱循环(甚至include?具有循环),并通过以下方式从O(n)变为O(1):


h = Hash[[a, a].transpose]

h['Dog']

1.我希望这很明显,但是可以避免异议:是的,仅需进行几次查找,Hash []和转置操作就可以控制配置文件,并且它们各自都是O(n)。


查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信