Returning all maximum or minimum values that can be multiple

后端 未结 3 685
情深已故
情深已故 2020-12-02 02:30

Enumerable#max_by and Enumerable#min_by return one of the relevant elements (presumably the first one) when there are multiple max

相关标签:
3条回答
  • 2020-12-02 02:40
    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]
    
    0 讨论(0)
  • 2020-12-02 02:45
    arr=[1, 2, 3, 5, 7, 8]
    mods=arr.map{|e| e%3}
    

    find max

    max=mods.max
    indices = []
    mods.each.with_index{|m, i| indices << i if m.eql?(max)}
    arr.select.with_index{|a,i| indices.include?(i)}
    

    find min

    min = mods.min
    indices = []
    mods.each.with_index{|m, i| indices << i if m.eql?(min)}
    arr.select.with_index{|a,i| indices.include?(i)}
    

    Sorry for clumsy code, will try to make it short.

    Answer by @Sergio Tulentsev is the best and efficient answer, found things to learn there. +1

    0 讨论(0)
  • 2020-12-02 02:54

    This is the hash equivalent of @Serio's use of group_by.

    arr = [1, 2, 3, 5]
    
    arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |e,h| h[e%3] << e }.max.last
      #=> [2, 5]
    

    The steps:

    h = arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |e,h| h[e%3] << e }
      #=> {1=>[1], 2=>[2, 5], 0=>[3]}
    a = h.max
      #=> [2, [2, 5]]
    a.last
      #=> [2, 5]
    
    0 讨论(0)
提交回复
热议问题