2015-02-12 13 views
0

阵列具有:Ruby on Rails的 - 获取在阵列中的多个按键max和总和组在同一时间

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

我想分组“C”,和“d”,和“E”的最大值由'a'和'b'组成。

所以,结果应该是:

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

到目前为止,我跟着How to find max value grouped by multiple keys in array of hashes?,使用此代码来获得各组

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

的最大请指引我,让总和了。非常感谢。

P/S:使用Ruby 1.8.7和Rails 2.3.5

+0

如果我的问题重复,那么可以给我一样的吗?谢谢 – Anh 2015-02-12 02:50:52

回答

1

这工作:

a.group_by { |h| h.values_at("a", "b") }.map do |_, v| 
    v.inject { |c, h| c.merge({ "c" => [c["c"], h["c"]].max, 
           "d" => c["d"] + h["d"], 
           "e" => c["e"] + h["e"] }) } 
end 
+0

Max,谢谢。但是,“e”的总和呢? – Anh 2015-02-12 03:21:49

+1

Anh - 你可以复制最后一个水龙头;例如:a.group_by {| h | h.values_at(“a”,“b”)} .map {| _,v | v.max_by {| h | h [“c”]} .tap {| h | h [“d”] = v.inject(0){| sum,h | sum + h [“d”]}} .tap {| h | h [“e”] = v.inject(0){| sum,h | sum + h [“e”]}}}编辑出我对版本的评论 - 认为我错了。 – Jonathan 2015-02-12 03:29:13

+0

乔纳森,在我的环境中工作很好。已经在1.8.7中定义了点击。但是,对于像我这样的初学者来说,语法可能很难。你可以将它扩展到更简单的格式吗?再次感谢你们。 – Anh 2015-02-12 03:38:17

1

当您在意见中的要求,这里是我的评论扩展到一个更简单的格式。我对Max的帖子的编辑被拒绝了。

a.group_by { |h| h.values_at("a", "b") }. 
    map { |_, v| v.max_by { |h| h["c"] }. 
    tap { |h| h["d"] = v.inject(0) { |sum, h| sum + h["d"] } }. 
    tap { |h| h["e"] = v.inject(0) { |sum, h| sum + h["e"] } } } 
+0

Jonathan,更多要求:从额外的键(“f”)(最大的“c”和“f”)获得最大值。请教我如何做到这一点。 – Anh 2015-02-12 06:59:44

相关问题