返回可以是多个的所有最大值或最小值

时间:2014-03-01 15:00:14

标签: ruby max min maxby

当接收器中有多个最大/最小元素时,

Enumerable#max_byEnumerable#min_by会返回相关元素的一个(可能是第一个)。例如,以下内容:

[1, 2, 3, 5].max_by{|e| e % 3}

仅返回2(或仅5)。

相反,我想返回所有最大/最小元素和数组。在上面的示例中,它将是[2, 5](或[5, 2])。得到这个的最佳方法是什么?

3 个答案:

答案 0 :(得分:10)

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]

答案 1 :(得分:0)

arr=[1, 2, 3, 5, 7, 8]
mods=arr.map{|e| e%3}
  

找到最大值

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)}
  

找到分钟

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)}

抱歉笨拙的代码,会尽量缩短代码。

@Sergio Tulentsev的回答是最好和最有效的答案,在那里找到要学习的东西。 1

答案 2 :(得分:0)

这是@ Serio使用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]

步骤:

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]