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
的其他变体或我是否需要从头开始写这个?
答案 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}]