ruby - 查找两个数组之间的精确值重叠
问题描述
我有两个数组
a1 = [1, 1, 1, 2, 3, 3, 3]
a2 = [1, 1, 3, 3, 5, 5]
我想返回出现在两个数组中的值以及它们出现的确切数量
# => [1, 1, 3, 3]
我不能使用a1 & a2
,因为这将返回唯一值([1, 3]
)
实现这一目标的最佳方法是什么?
解决方案
看起来你所拥有的并不是真正的数组,它们是multisets或bag。
编程中有一条一般规则:如果你选择正确的数据表示,你的算法就会变得更简单。
因此,如果您使用多重集而不是数组,您的问题将变得微不足道,因为您正在寻找的实际上只是两个多重集的交集。
不幸的是,核心或标准库中没有多集实现,但网络上有几个多集 gem。例如,有multimap gem,它也包括一个多重集。不幸的是,它需要一点爱和关怀,因为它使用了只能在 YARV 2.2 之前使用的 C 扩展。还有multiset gem。
require 'multiset'
m1 = Multiset.new(a1)
#=> #<Multiset:#3 1, #1 2, #3 3>
m2 = Multiset.new(a2)
#=> #<Multiset:#2 1, #2 3, #2 5>
m = m1 & m2
#=> #<Multiset:#2 1, #2 3>
就个人而言,我不太喜欢inspect
输出,但我们可以看到发生了什么并且结果是正确的:m
包含 2 ×1
和 2 × 3
。
如果你真的需要结果作为一个Array
,你可以使用Multiset#to_a
:
m.to_a
#=> [1, 1, 3, 3]
推荐阅读
- c# - 将用户输入的字符串转换为c#中的对象
- css - 垫选择选项未正确渲染
- javascript - .keydown() 当按下返回键
- c# - UWP C# ListView 返回点击行的Id值
- java-8 - iText 7.0.2 将固定大小的表格添加到文档文本不换行并且某些情况进入无限循环
- c# - 压缩 base64 字符串时,LZ4Net.Wrap 结果为更大的字符串
- android - 错误:资源“attr/tintMode”的重复值与配置
- android - C++读取内部文件Android NDK
- java - 在返回和传递值时遇到问题;“数数”
- angular - Angular - 无法使用 Bing Map 图钉单击重定向到另一个组件