比较2个符号数组

时间:2011-09-24 04:18:25

标签: ruby arrays symbols

我是红宝石的新手,我一直在谷歌搜索几个小时,但我无法想象这一个。它看起来应该很容易,所以我很沮丧。

我在ruby工作,需要比较2个符号数组才能获得真或假的回报。

array1 = [:a, :c]
array2 = [:a, :b, :c]

我需要做的比较是查看array2是否包含array1的所有元素。 在这种情况下,array2包含array1,但array1不包含array2。

我试过了:

array2.to_s.include?(array1.to_s) 

如果它们的顺序相同,则只返回true,因为它需要转换为字符串进行比较。因此它返回false(不是我正在寻找的),但是如果array2 = [:a,:c,:b]那将是真的。是否有更合适的方法进行比较?

3 个答案:

答案 0 :(得分:1)

你可以使用 - 。 e.g:

array1 - array2 #=> returns empty array, if array2 include all array1 elements. 

希望这可以解决您的问题。

答案 1 :(得分:1)

对于小型阵列,venj的答案很好,但对于大型阵列可能效果不佳(这是有争议的)。既然你基本上做了一个set操作(“Set(array1)是Set(array2)的一个子集?”),那么看看Ruby自己的Set library是如何做到这一点的。 Set有一个subset? method,看看它的来源,我们看到它简短而甜蜜:

def subset?(set)
  set.is_a?(Set) or raise ArgumentError, "value must be a set"
  return false if set.size < size
  all? { |o| set.include?(o) }
end

我们可以从数组中实例化两个Set对象并将其称为一天,但是将它提炼成直接在它们上运行的oneliner也很容易:

array1 = [:a, :c]
array2 = [:a, :b, :c]

array1.length < array2.length && array1.all? {|el| array2.include? el }
# => true

array1 << :z
array1.length < array2.length && array1.all? {|el| array2.include? el }
# => false

答案 2 :(得分:0)

您可以将此方法添加到Array类。

#!/usr/bin/env ruby

class Array
  def includes_other(arr)
    raise "arr must be an Array" unless arr.kind_of? Array
    return (arr - self).length == 0
  end
end

arr1 = [:a, :c, :e]
arr2 = [:e, :a, :c, :d]

puts arr2.includes_other(arr1) # prints true

arr3 = [:x, :c, :e]

puts arr3.includes_other(arr1) # prints false