数组 – Ruby – 数组交集(带有重复项)

前端之家收集整理的这篇文章主要介绍了数组 – Ruby – 数组交集(带有重复项)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有阵列(1和2).我如何从中获取array3?
array1 = [2,2,3,4,5,6,7,8,9]

array2 = [2,0]

array3 = [2,8]

array1& array2返回[2,8],但我需要保留重复项.

解决方法

(array1 & array2).flat_map { |n| [n]*[array1.count(n),array2.count(n)].min }
  #=> [2,8]

步骤:

a = array1 & array2 
  #=> [2,8]

(2)的第一个元素被传递给块并分配给块变量:

n = 2

并执行块计算:

[2]*[array1.count(2),array2.count(2)].min
  #=> [2]*[4,3].min
  #=> [2]*3
  #=> [2,2]

所以2被映射到[2,2]. a的其余三个元素的计算类似.当我使用flat_map时,返回[2,8].

你难以记住Enumerable#flat_mapEnumerable#map的不同之处吗?假设我使用的是map而不是flat_map.然后

a.map { |n| [n]*[array1.count(n),array2.count(n)].min }
  #=> [[2,2],[3],[4],[8]]

flat_map不会在每个数组前面放置一个splat:

[*[2,*[3],*[4],*[8]]
  #=> [2,8]

如果数组array1和array2很大并且效率是一个问题,我们可以做一些O(N)预处理:

def cnt(arr)
  arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
end

cnt1 = cnt(array1)
  #=> {2=>4,3=>2,4=>1,5=>1,6=>1,7=>1,8=>1,9=>1} 
cnt2 = cnt(array2)
  #=> {2=>3,3=>1,4=>4,8=>2,0=>3} 

(array1 & array2).flat_map { |n| [n]*[cnt1[n],cnt2[n]].min }
  #=> [2,8]

猜你在找的Ruby相关文章