2015-02-12 12 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

相關問題