我想看一个数组里面是否有一个或多个值.例如,像这样:
[1,2,3,4,5,6].include?([4,1]) # => true
[4,1,6,2].include?([4,1]) # => true
[3,4,7].include?([4,1]) # => false
Run Code Online (Sandbox Code Playgroud)
当然,"包括?" 方法只能检查一个值.有没有检查多个值的方法?
kur*_*umi 58
>> [1,2,3,4,5,6] & [4,1]
=> [1, 4]
>> [1,2,3,4,5,6] & [7,9]
=> []
>>
Run Code Online (Sandbox Code Playgroud)
Mar*_*mas 26
这是一个设定的操作.Set在标准库中.
require 'set'
a = Set[1,2,3,4,5,6]
b = Set[4,1]
b.subset? a
#=> true
Run Code Online (Sandbox Code Playgroud)
Ste*_*ven 16
编辑:我支持Mark Thomas使用核心Set 类的替代解决方案.
虽然我的解决方案更严格地回答了如何使用数组执行此操作的问题,但sjsc可能会受益于查看自己的情况并探索使用集合的选项.
有很多有效的reasond使用数组(维护顺序,允许重复),以下仍然足够,但如果不涉及这些,sjsc可能实际上受益于使用Set而不是Array,并且在这个程度上,Mark的解决方案在语义上更优越.
我不知道有任何库方法可以做到这一点,但编写自己的函数并不难.
class Array
def subset?(a)
(self - a).length == 0
end
end
Run Code Online (Sandbox Code Playgroud)
我确信有更高效的方法可以实现这一目标,但这应该是您正在寻找的.
做阵列交叉工作,基本上是相同的事情.
class Array
def subset?(a)
(self & a).length == length
end
end
Run Code Online (Sandbox Code Playgroud)
这个级别的优化不会对问题产生太大影响,但您不想做的是多次开始比较数组:
class Array
# don't do this
def subset?(a)
(self & a) == a
end
end
Run Code Online (Sandbox Code Playgroud)
对@ Schwartzie方法的快速而肮脏的扩展:
larger_array = [1,2,3,4,5,6]
smaller_array = [4,1]
smaller_array.all? {|smaller_array_item| larger_array.include?(smaller_array_item)}
Run Code Online (Sandbox Code Playgroud)
根据kurumi和spyle的建议,这是我的测试:
([1,2,3,4,5,6]和[4,1])。是吗?#=>是
但是,.any?将任何对象变为true
([1,2,3,4,5,6]和[6,7])。是吗?#=>是
所以我认为这可能是一个可行的方法:
([1,2,3,4,5,6]和[6,7])。length == [6,7] .length#=> false
(更大数组和更小的数组).length ==较小的数组.length