如何检查数组的值是否包含一个或多个值?

sjs*_*jsc 23 ruby arrays

我想看一个数组里面是否有一个或多个值.例如,像这样:

[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)


And*_*imm 6

对@ 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)


xjl*_*in0 5

根据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