首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有重复项的“&”模拟

问带有重复项的“&”模拟
EN

Stack Overflow用户
提问于 2016-09-18 08:45:21
回答 3查看 113关注 0票数 2

来自Ruby文档:

ary & other_ary→new_ary Set交集-返回一个新数组,其中包含两个数组共有的元素,不包括任何重复的元素。顺序从原始数组中保留下来。

但是,是否有一个内置的方法来执行(包括重复的)相同的事情?

测试用例:

代码语言:javascript
复制
ary = [2, 7, 3, 7]
other_ary = [7, 2, 7, 4]
new_ary == [2, 7, 7]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-18 10:54:30

下面的解决方案并不是最优雅的解决方案,但它在任何情况下都会返回正确的答案:

代码语言:javascript
复制
[ary, other_ary].map { |e| e.group_by { |e| e } } # &:itself since 2.3
                .reduce { |memo, h| memo.merge(h) do |k, o, n|
                                      [o.count, n.count].min
                                    end } # merge to count
                .select { |_, v| Integer === v } # select only merged
                .flat_map { |k, v| [k] * v } # produce a result

或者,更优雅的变异数组:

代码语言:javascript
复制
a1, a2 = [ary, other_ary].map(&:dup) # to keep originals intact
loop.inject([]) do |memo|
  break memo if a1.empty?
  memo << (a2.delete_at(a2.index a1.pop) rescue nil)
end.compact
#⇒ [7, 7, 2]

甚至:

代码语言:javascript
复制
a1, a2 = [ary, other_ary].map(&:dup) # to keep originals intact
loop.each_with_object([]) do |_, memo|
  break memo if a1.empty?
  a2.index(a1.pop).tap { |i| memo << a2.delete_at(i) if i }
end
票数 3
EN

Stack Overflow用户

发布于 2016-09-18 08:53:29

也许是这样的?

代码语言:javascript
复制
ary.select{ |a| other_ary.include? a }
#=> [2, 7, 7]
票数 2
EN

Stack Overflow用户

发布于 2016-09-19 18:18:13

我对这个问题的理解是,给您两个数组,a和b,并希望返回第三个数组,其中包含a和b中每个元素e的n副本,其中n = [a.count(e), a.count(e)].max。

假设

代码语言:javascript
复制
a = [3,1,2,1,0,1]
b = [1,2,4,2,4,6]

我建议你执行以下三个步骤。

为每个数组构造一个计数散列

代码语言:javascript
复制
ha = a.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
  #=> {3=>1, 1=>3, 2=>1, 0=>1} 
hb = b.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
  #=> {1=>1, 2=>2, 4=>2, 6=>1} 

确定两个数组的公共元素

代码语言:javascript
复制
common_elements = a & b
  #=> [1, 2]

构造所需的数组

代码语言:javascript
复制
common_elements.flat_map { |n| [n]*[ha[n], hb[n]].max }
  #=> [1, 1, 1, 2, 2] 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39555742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档