如何严格检查Ruby数组是否仅包含某些值?

时间:2019-07-03 09:29:15

标签: ruby-on-rails ruby ruby-on-rails-5

我需要检查一个数组,看看它是否仅包含另一个数组的某些值。

我可以想到使用方法mapselect,然后使用includes?遍历数组的方法,但这远没有效率。

values = ['2','4','5'] # return true if the array only contains these values...

a = ['1', '2', '3']
b = ['1', '2', '4']
c = ['2', '4']
d = ['4', '5']

def compare(checked_array, standard)
 # Do something
end

因此,出于我的目的,输出应该是

  • check(a,values)将返回false
  • check(b,values)将返回false
  • check(c,values)将返回true
  • check(d,values)将返回true

4 个答案:

答案 0 :(得分:4)

简单的减法将为您提供所需的输出,

def compare(checked_array, standard)
 (checked_array - standard).empty?
end

答案 1 :(得分:2)

数组交集的另一种方法:

def compare(checked_array, standard)
  (checked_array & standard) == standard
end

答案 2 :(得分:2)

您可以使用Set#subset?

require 'set'

def compare(checked_array, standard)
 s = Set.new(standard)
 c = Set.new(checked_array)
 c.subset? s
end

文档说明:

  

Set实现了具有无重复的无序值的集合。这是Array直观的互操作功能与Hash的快速查找的结合。

答案 3 :(得分:2)

可能不如使用减法/相交那么短而甜美,但这里是这样:

df <- structure(list(Indx = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), Operation1 = c(1, 0.5, 0, 1, 0.5, 
1, 0.5, -1, 1, 0, 0.5, 0, 0.5, 1, 0.5, 0, -1), Operation2 = c(450L, 
84L, 48L, 4L, 4L, 123L, 14L, 45L, 471L, 47L, 44L, 145L, 78L, 
71L, 19L, 2L, 45L)), class = "data.frame", row.names = c(NA, -17L))