我有一个值“狗”和一个数组[“猫”、“狗”、“鸟”]。
如何在不循环的情况下检查数组中是否存在它?是否有一种简单的方法来检查该值是否存在?
我有一个值“狗”和一个数组[“猫”、“狗”、“鸟”]。
如何在不循环的情况下检查数组中是否存在它?是否有一种简单的方法来检查该值是否存在?
当前回答
['Cat', 'Dog', 'Bird'].detect { |x| x == 'Dog'}
=> "Dog"
!['Cat', 'Dog', 'Bird'].detect { |x| x == 'Dog'}.nil?
=> true
其他回答
您正在查找包含项?:
>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true
使用Enumerable#include:
a = %w/Cat Dog Bird/
a.include? 'Dog'
或者,如果完成了大量测试,1您可以摆脱循环(甚至包括?has),并通过以下方式从O(n)变为O(1):
h = Hash[[a, a].transpose]
h['Dog']
1.我希望这是显而易见的,但为了避免反对意见:是的,对于几个查找,Hash[]和转置操作占据了配置文件的主导地位,并且每个操作本身都是O(n)。
如果要返回值而不仅仅是true或false,请使用
array.find{|x| x == 'Dog'}
如果列表中存在“Dog”,则返回该值,否则为零。
这是另一种方法:使用Array#索引方法。
它返回数组中元素第一次出现的索引。
例如:
a = ['cat','dog','horse']
if a.index('dog')
puts "dog exists in the array"
end
index()也可以采用一个块:
例如:
a = ['cat','dog','horse']
puts a.index {|x| x.match /o/}
这将返回数组中包含字母“o”的第一个单词的索引。
检查是否存在
使用include?
例子:
arr = [1, 2, 3]
arr.include?(1) -> true
arr.include?(4) -> false
支票不存在
使用排除?
例子:
arr = %w(vietnam china japan)
arr.exclude?('usa') -> true
arr.exclude?('china') -> false