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

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

如何在没有循环的情况下检查数组中是否存在?有没有一种简单的方法来检查值是否存在,仅此而已?


您正在寻找include?

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

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

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

OTOH,Ruby本身没有in操作员或#in?方法,尽管之前已经提出过,特别是Yusuke Endoh是红宝石核心的顶级成员。

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

['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?在a上使用时要小心Range,有细微之处,所以请参阅文档并与cover?… 进行比较


尝试

['Cat', 'Dog', 'Bird'].include?('Dog')

使用Enumerable#include

a = %w/Cat Dog Bird/

a.include? 'Dog'

或者,如果完成了许多测试,1你可以摆脱循环(甚至include?有)并从O(n)转到O(1)

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

如果你想通过街区检查,你可以试试吗?还是全部?

%w{ant bear cat}.any? {|word| word.length >= 3}   #=> true  
%w{ant bear cat}.any? {|word| word.length >= 4}   #=> true  
[ nil, true, 99 ].any?                            #=> true  

详细信息如下:http//ruby-doc.org/core-1.9.3/Enumerable.html
我的灵感来自这里:https//stackoverflow.com/a/10342734/576497


几个答案表明Array#include?,但有一个重要的警告:查看源代码,甚至Array#include?执行循环:

rb_ary_includes(VALUE ary, VALUE item)
{
    long i;

    for (i=0; i<RARRAY_LEN(ary); i++) {
        if (rb_equal(RARRAY_AREF(ary, i), item)) {
            return Qtrue;
        }
    }
    return Qfalse;
}

在没有循环的情况下测试单词存在的方法是为数组构建一个trie。那里有许多trie实现(google“ruby trie”)。我将rambling-trie在这个例子中使用:

a = %w/cat dog bird/

require 'rambling-trie' # if necessary, gem install rambling-trie
trie = Rambling::Trie.create { |trie| a.each do |e| trie << e end }

现在我们已经准备好测试数组中各种单词的存在,而不是在O(log n)时间上循环Array#include?,使用与子线性相同的句法简单性Trie#include?

trie.include? 'bird' #=> true
trie.include? 'duck' #=> false
Tags:,

添加评论

友情链接:蝴蝶教程