当
接收器中有多个最大/最小元素时,Enumerable#max_by
和Enumerable#min_by
返回一个相关元素(可能是第一个)。例如,以下内容:
[1, 2, 3, 5].max_by{|e| e % 3}
仅返回 2
(或仅返回 5
)。
相反,我想返回所有最大/最小元素并在数组中。在上面的示例中,它将是[2, 5]
(或[5, 2]
)。获得此内容的最佳方法是什么?
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]
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的回答 图伦采夫是最好和有效的答案,在那里找到了可以学习的东西。 +1
这是
@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]