查找数组的所有元素的最大值

时间:2014-05-13 06:12:11

标签: ruby arrays max

假设我有一个数组,即arr[1, 2, 3, 4, 8, 8],我想找到这个数组中的所有最大元素:

arr.allmax # => [8, 8]

是否有内置的方法组合来解决这个问题?我不想像现在这样做补丁:

class Array
  def allmax
    max = self.max
    self.select { |e| e == max }
  end
end

猴子补丁不是一个好主意,我可以这样做:

some_array.select { |e| e == some_array.max }

它将作为allmax。感谢所有关于灵感的答案和评论。

3 个答案:

答案 0 :(得分:1)

这是一种方式:

2.1.0 :006 > arr = [1, 2, 3, 4, 8, 8]
 => [1, 2, 3, 4, 8, 8] 
2.1.0 :007 > arr.group_by { |i| i }.max.last
 => [8, 8] 
2.1.0 :008 > 

这是一种方法: -

  def all_max(arr)
    return [] if arr.empty?
    arr.group_by { |i| i }.max.last
  end

答案 1 :(得分:1)

这是一种有趣的方式。

arr.sort!.slice arr.index(arr[-1]) || 0..-1

对数组进行排序,然后找到与数组最右边索引匹配的数组的最左边索引,并获取与该范围匹配的子切片(如果数组为空,则为0 ..- 1)。

这个很有趣,因为它不需要中间数组,但它会改变输入以实现单行。

答案 2 :(得分:1)

另一种方式:

def all_max(arr)
  return [] if arr.empty?
  mx = arr.max
  [mx] * arr.count { |e| e == mx }
end

all_max([1, 2, 3, 4, 8, 8]) 
  #=> [8, 8]

要在一次传递中构造数组,您可以这样做:

arr.each_with_object([]) do |e,a|
  if a.empty?
    a << e
  else
    case e <=> a.first
    when 0 then a << e
    when 1 then a.replace([e])
    end
  end
end