0

我有两个数组:

a1 = [1,4,4,4,5,6]
a2 = [4,4,4]

我正在尝试确定是否a1恰好有三个 4 像a2.

我尝试使用子集,但它似乎排除了重复值。

require 'set'
a1 = Set.new [1,4,4,4,5,6]
=> #<Set: {1, 4, 5, 6}> 
a2 = Set.new [4,4,4]
=> #<Set: {4}>
a2.subset?(a1)
=> true

这不起作用,因为当它创建集合时,它会忽略所有重复项。

这同样适用于:

(a1 & a2) == a1

和:

(a2 & a1) == a2
4

3 回答 3

1

您可以使用each_cons分成a1多个块(即[1,4,4], [4,4,4], [4,4,5], [4,5,6])。然后您可以查看是否有任何这些块匹配a2

a1 = [1,4,4,4,5,6]
a2 = [4,4,4]

a1.each_cons(3).include?(a2)
# => true

a1 = [1,4,5,6,4,4]
a1.each_cons(3).include?(a2)
# => false
于 2013-08-08T17:35:40.837 回答
1
>> a1 = [1,4,4,4,5,6]
>> a2 = [4,4,4]
>> a1.count(4) == 3 # => true
>> a1.count(4) == a2.count(4) # => true
于 2013-08-08T17:40:36.173 回答
0

如果你Enumerable#find_all在一个数组上运行,它将返回一个包含所有找到的元素的数组。

对于这个特定的问题,正如 falsetru 所回答的那样,Enumerable#count它更容易且更具可读性。

注意:如果两个数组的元素都为 0,这也将返回 true:

def same_amounts?(ar1, ar2, ele)
  ar1.count(ele) == ar2.count(ele)
end

a1 = [1,4,4,4,5,6]
a2 = [4,4,4]
puts same_amounts?(a1,a2,4)   #true
于 2013-08-08T17:42:56.870 回答