加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:28:22 所属栏目:百科 来源:网络整理
导读:我有阵列(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
我有阵列(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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读