arrays - Ruby:比较两个数组数组的有效方法
问题描述
我搜索最有效的方法来获得两个数组数组之间的差异。在这一点上,我不知道使用哈希是否会更好。
我有两个数组数组,其中一个 id 和一个转换为 int 的日期时间。
a = [[1, 1234],[2, 7345],[3, 12769],[4, 13456], [5, 34765]]
b = [[1, 1234],[3, 12769],[2, 7345],[5, 39875],[4, 13459]]
我的目标是知道 a 的每个数组中包含的日期是否优于 b 中具有相同 id 的日期,并保留与比较匹配的数组,否则我会做类似 a - b 的事情。
即使有大量阵列,最快和最干净的方法是什么?
另一种方法是使用哈希,我真的不知道该使用什么。
a = [{id: 1, date: 1234},{id: 2, date: 7345},{id: 3, date: 12769},{id: 4, date: 13456},{id: 5, date: 34765}]
b = [{id: 1, date: 1234},{id: 3, date: 12769},{id: 2, date: 7345},{id: 5, date: 39875}, {id: 4, date: 13459}]
你觉得呢?你有没有什么想法 ?
解决方案
b
具有哈希值更容易且性能更好。幸运的是,可以将 2 元素数组的数组直接转换为散列 with .to_h
(并返回数组 with .to_a
)。
# this will make an { <id> => <date> } hash
b_hash = b.to_h
现在过滤步骤只涉及一个select
over a
,检查b_hash
. 我用来|(id, date)|
将数组解构为各个元素:
result = a.select do |(id, date)|
b_hash[id] > date
end
请注意,您确实希望将.to_h
调用保持在select
循环之外,因为它是 O(N) 操作。
你可以在不转换的情况下做到这一点b.to_h
,你只需要循环遍历b
的每个元素a
,将时间复杂度从 O(N) 变为 O(N^2)
推荐阅读
- reactjs - 更新了 ReactJS 功能组件中的嵌套对象
- javascript - Autobahn-JS 未收到在同一页面上发布的订阅(示例)
- python - 选择新的下拉值时,如何在回调中清除添加到我的散景图中的字形?
- android - Flutter 应用需要检查蓝牙和位置是否启用
- java - 如何使用 maven 在 jar 编译中包含非 java 文件?
- excel-formula - 如何在PowerBI中执行同一列的先前单元格的总和
- c++ - C++ 方法定义不知道类类型
- python - 如何在ubuntu中使用xampp运行python脚本
- .htaccess - htaccess RewriteRule 前导斜杠?
- c# - 引导卡未显示在视图中