数组 – 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] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容