【问题标题】:How can I do a strict check on if a Ruby array contains only certain values? [duplicate]如何严格检查 Ruby 数组是否仅包含某些值? [复制]
【发布时间】:2025-12-03 21:15:01
【问题描述】:

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

我可以想办法使用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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这个简单高效,谢谢!它的一行代码我会使用 15... 好多了?
    【解决方案2】:

    数组交集的另一种方式:

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

    【讨论】:

      【解决方案3】:

      可能不像使用减法/交集那么短小精悍,但这里是:

      require "set"
      def compare(check_array, standard
          standard.to_set.superset?(check_array.to_set) # return true if check_array is subset of standard
      end
      

      【讨论】:

      • 没有方法作为超集,它的超集? standard.to_set.superset?(check_array.to_set)
      【解决方案4】:

      你可以使用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 的快速查找的混合体。

      【讨论】:

        最近更新 更多