Ruby on rails 如果有多个具有相同最大值,则将最大值作为数组获取
Ruby有Ruby on rails 如果有多个具有相同最大值,则将最大值作为数组获取,ruby-on-rails,ruby,max,Ruby On Rails,Ruby,Max,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 { |it
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}
因此,它将返回一个最大值(我认为是第一个),即使有两个项目具有相同的最大值。我想实现一个函数,在这种情况下给出这两个项。是否有其他的
max_by
变体,或者我需要从头开始写吗?据我所知,没有这样的方法。但是,下面应该可以(我将它添加到数组中
,只是因为我在irb中工作
-您可以在最有意义的地方对它进行猴子补丁)
groupby
的工作有点太难了,但它确实可以实现。您为每个元素+1调用了两次block
(这可能是一个昂贵的操作),groupby
绝对是更好的解决方案。不知道groupby
;很好。我知道groupby
,但无法思考这个逻辑。我不得不读了两遍这篇文章才能得到逻辑。太棒了!!
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}]
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}]