получить максимум в виде массива в случае более одного с тем же максимальным значением - PullRequest
3 голосов
/ 08 февраля 2012

Ruby имеет Enumerable#max и Enumerable#max_by, и я использую max_by следующим образом.

array = [
           {:a => 1, :b => 2, :c => 3}, 
           {:a => 3, :b => 2, :c => 4}, 
           {:a => 3, :b => 1, :c => 4}
        ]
max_item = array.max_by { |item| item[:b] }
=> {:b=>2, :c=>3, :a=>1}

Итак, он вернет один максимум (я думаю, во-первых), даже если есть2 предмета с одинаковым максимальным значением.Я хочу реализовать функцию, которая дает оба элемента в таких случаях.Есть какой-то другой вариант max_by или мне для этого нужно написать с нуля?

Ответы [ 2 ]

9 голосов
/ 08 февраля 2012
array = [
           {:a => 1, :b => 2, :c => 3}, 
           {:a => 3, :b => 2, :c => 4}, 
           {:a => 3, :b => 1, :c => 4}
        ]

array.group_by{|el| el[:b]}.max.last 
#=>[{:a=>1, :b=>2, :c=>3}, {:a=>3, :b=>2, :c=>4}]

group_by работает немного слишком усердно, но это доставляет.

4 голосов
/ 08 февраля 2012

Насколько я знаю, такого метода не существует.Тем не менее, следует выполнить следующее (я добавил его в Array просто потому, что работал в irb - вы можете исправить это, когда это будет наиболее целесообразно)

class Array
  def maxes_by &block
    max_condition = block.call(max_by(&block))
    select {|it| block.call(it) == max_condition}
  end
end

array = [
           {:a => 1, :b => 2, :c => 3}, 
           {:a => 3, :b => 2, :c => 4}, 
           {:a => 3, :b => 1, :c => 4}
        ]
array.maxes_by{|it| it[:b]}
# => [{:a=>1, :b=>2, :c=>3}, {:a=>3, :b=>2, :c=>4}]
...