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

ruby – 如何在哈希数组中找到由多个键分组的最大值?

发布时间:2020-12-17 03:53:59 所属栏目:百科 来源:网络整理
导读:有这种结构的数据.将按’c’按升序排列. [ { 'a' = 1,'b' = 1,'c' = 1,'d' = '?' },{ 'a' = 1,'c' = 2,'c' = 3,'b' = 2,'c' = 4,'c' = 5,{ 'a' = 2,'c' = 6,'c' = 7,'c' = 8,'c' = 9,'c' = 10,'d' = '?' } ] 想要通过’a’和’b’的每个唯一组合分组的’c’
有这种结构的数据.将按’c’按升序排列.

[ { 'a' => 1,'b' => 1,'c' =>  1,'d' => '?' },{ 'a' => 1,'c' =>  2,'c' =>  3,'b' => 2,'c' =>  4,'c' =>  5,{ 'a' => 2,'c' =>  6,'c' =>  7,'c' =>  8,'c' =>  9,'c' => 10,'d' => '?' } ]

想要通过’a’和’b’的每个唯一组合分组的’c’的最大值的数组.

[ { 'a' => 1,'d' => '?' } ]

其他键需要保留,但与转换无关.到目前为止,我能想到的最好的方法是反转数组(因此按’c’降序排序),uniq’a’和’b’,以及反向数组.但我依赖于uniq_by的实现总是返回找到的第一个唯一项目.规范没有说明,所以我担心依赖于这种行为,因为它可能会在未来的版本中发生变化.还想知道这可能是一个非常低效的方法.

@data.reverse!.uniq!{|record| [record['a'],record['b']]}.reverse!

有没有更好,更有效的方法来做到这一点?如果你有一个更好的方法,你也可以解释它,而不是只给我一个超级讨厌的单行,我可能无法破译.

解决方法

这实际上相当容易:

a.group_by { |h| h.values_at("a","b") }.map { |_,v| v.max_by { |h| h["c"] } }

或者使用更好的格式:

a.group_by do |h|
  h.values_at("a","b") 
end.map do |_,v| 
  v.max_by { |h| h["c"] }
end

说明:首先我们使用Enumerable#group_by创建一个哈希,其中“a”和“b”的组合(用Hash#values_at提取)作为键,所有哈希值与该组合作为值.然后,我们映射此哈希,忽略键并从具有Enumerable#max_by的数组中选择具有“c”的最大值的元素.

(编辑:李大同)

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

    推荐文章
      热点阅读