我有阵列(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_map与Enumerable#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]