sawa sawa - 6 months ago 21
Ruby Question

Returning all max/min values

Enumerable#max_by
and
Enumerable#min_by
return one of the relevant elements (presumably the first one) when there are multiple max/min elements in the receiver. For example, the following:

[1, 2, 3, 5].max_by{|e| e % 3}


returns only
2
(or only
5
).

Instead, I want to return all max/min elements and in an array. In the example above, it would be
[2, 5]
(or
[5, 2]
). What is the best way to get this?

Answer
arr = [1, 2, 3, 5]

arr.group_by{|a| a % 3} # => {1=>[1], 2=>[2, 5], 0=>[3]}
arr.group_by{|a| a % 3}.max.last # => [2, 5]