如果多个具有相同的最大值,则获得最大值作为数组

时间:2012-02-08 13:28:23

标签: ruby-on-rails ruby max

Ruby有Enumerable#maxEnumerable#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 个答案:

答案 0 :(得分:9)

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工作有点太难了,但确实有效。

答案 1 :(得分:4)

据我所知,没有这样的方法。但是,以下情况应该这样做(我已将其添加到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}]